2009-11-13 102 views

回答

118

NSArray不可變,也就是說,你不能修改它。你應該看看NSMutableArray。退房「刪除對象」部分,你會發現有很多的功能,讓您刪除項目:

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

注:[-removeObject:(HTTPS ://developer.apple.com/library/ios/documentation/cocoa/reference/foundation/classes/NSMutableArray_Class/Reference/Reference.html#//apple_ref/oc c/instm/NSMutableArray/removeObject :)刪除數組中所有匹配的事件**。 – Pang 2014-03-13 09:17:45

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

[arrayThatYouCanRemoveObjects removeObjectAtIndex:your_object_index]; 

[your_array release]; 

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

這就是它

,如果你沒有自己的your_array(即它的自動釋放)刪除發佈&保留消息

20

此類別可能是你的口味。但!使用它要節儉;因爲我們正在轉換爲NSMutableArray並再次返回,所以效率並不高。

@implementation NSArray (mxcl) 

- (NSArray *)arrayByRemovingObject:(id)obj 
{ 
    if (!obj) return [self copy]; // copy because all array* methods return new arrays 
    NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:self]; 
    [mutableArray removeObject:obj]; 
    return [NSArray arrayWithArray:mutableArray]; 
} 

@end 
+1

你是冠軍!我不得不使用上面的方法,因爲我排序了一個NSMutableArray,這意味着我在我的表格單元格中使用的數組是不可變的。因此,當我去從數組中刪除對象時,我使用你的方法來做到這一點。 – fuzz 2011-02-06 10:34:05

2

做了一個類似mxcl的類,但是這個速度稍快。

我的測試顯示〜15%的提高(我可能是錯的,隨時可以自己比較兩者)。

基本上我把這個數組的那部分放在對象的前面,並把它們組合起來。因此排除元素。

- (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];'這裏的初始化是多餘的 – Ossir 2014-04-24 14:14:22

+0

如果obj爲零,該怎麼辦? – 2014-06-01 00:23:59

+1

@Ossir你說得對,聲明是多餘的,因爲'[self subarray ...]'部分。 @Michael Ozeryansky,如果obj是nil'indexOfObject'將返回'NSNotFound'。我不確定會發生什麼,但它可能不是正確的,謝謝! – jmathew 2014-06-02 15:27:35

16

下面是使用鍵 - 值編碼一個功能更強大的方法:

@implementation NSArray (Additions) 

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

@end 
+0

聰明!感謝分享。 – KPM 2014-10-27 22:47:45

3

NSArray本辦法刪除Object

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