2009-11-13 103 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]; 
}