2009-11-13 20 views

Antwort

118

NSArray ist nicht änderbar, dh Sie können es nicht ändern. Sie sollten einen Blick auf NSMutableArray werfen. Schauen Sie sich den Abschnitt „Objekte entfernen“, werden Sie es viele Funktionen, die es Ihnen ermöglichen, Elemente zu entfernen:

[anArray removeObjectAtIndex: index]; 
[anArray removeObject: item]; 
[anArray removeLastObject]; 
+3

Hinweis: [-removeObject:] (https : //developer.apple.com/library/ios/documentation/cocoa/reference/foundation/classes/NSMutableArray_Class/Reference/Reference.html#//apple_ref/oc c/instm/NSMutableArray/removeObject :) löscht ** alle übereinstimmenden Vorkommen ** im Array. – Pang

23
NSMutableArray *arrayThatYouCanRemoveObjects = [NSMutableArray arrayWithArray:your_array]; 

[arrayThatYouCanRemoveObjects removeObjectAtIndex:your_object_index]; 

[your_array release]; 

your_array = [[NSArray arrayWithArray: arrayThatYouCanRemoveObjects] retain]; 

, die etwa ist es

, wenn Sie eigene your_array nicht (dh es Autoreleased) Entfernen Sie die Freigabe & Retain Nachrichten

20

Diese Kategorie kann nach Ihrem Geschmack sein. Aber! Sei sparsam mit seiner Verwendung; Da wir in ein NSMutableArray und wieder zurück konvertieren, ist es überhaupt nicht effizient.

+1

du bist ein Champion! Ich musste die obige Methode verwenden, weil ich ein NSMutableArray sortiere, was bedeutet, dass das Array, das ich in meinen Tabellenzellen verwende, nicht veränderbar ist. Wenn ich also Objekte aus dem Array entferne, benutze ich Ihre Methode dazu. – fuzz

2

Eine Kategorie wie mxcl gemacht, aber das ist etwas schneller.

Meine Tests zeigen ~ 15% Verbesserung (ich könnte falsch liegen, fühlen Sie sich frei, die zwei selbst zu vergleichen).

Grundsätzlich nehme ich den Teil des Arrays vor dem Objekt und den Teil dahinter und kombiniere sie. Also das Element ausschließen.

- (NSArray *)prefix_arrayByRemovingObject:(id)object 
{ 
    if (!object) { 
     return self; 
    } 

    NSUInteger indexOfObject = [self indexOfObject:object]; 
    NSArray *firstSubArray = [self subarrayWithRange:NSMakeRange(0, indexOfObject)]; 
    NSArray *secondSubArray = [self subarrayWithRange:NSMakeRange(indexOfObject + 1, self.count - indexOfObject - 1)]; 
    NSArray *newArray = [firstSubArray arrayByAddingObjectsFromArray:secondSubArray]; 

    return newArray; 
} 
+0

'NSArray * newArray = [NSArray-Array];' Initialisierung ist hier redundant – Ossir

+0

Was ist, wenn obj ist Null? –

+1

@Ossir Sie haben Recht, die Deklaration ist redundant, weil der '[self subarray ...]' Teil. @Michael Ozeryansky, wenn das obj ist nil 'indexOfObject' wird' NSNotFound' zurückgeben. Ich bin mir nicht sicher, was dann passiert, aber es ist wahrscheinlich nicht das Richtige, danke! – jmathew

16

Hier ist ein funktioneller Ansatz Schlüsselwert Coding:

@implementation NSArray (Additions) 

- (instancetype)arrayByRemovingObject:(id)object { 
    return [self filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF != %@", object]]; 
} 

@end 
+0

Clever! Danke für das Teilen. – KPM

3

entfernen Object von NSArray mit dieser Methode:

-(NSArray *) removeObjectFromArray:(NSArray *) array withIndex:(NSInteger) index { 
    NSMutableArray *modifyableArray = [[NSMutableArray alloc] initWithArray:array]; 
    [modifyableArray removeObjectAtIndex:index]; 
    return [[NSArray alloc] initWithArray:modifyableArray]; 
} 
Verwandte Themen