NSArray +从数组中删除项目

如何从NSArray中删除一个项目。

NSArray是不可变的,也就是说,你不能修改它。 你应该看看NSMutableArray 。 查看“删除对象”部分,您会发现有许多function可以删除项目:

[anArray removeObjectAtIndex: index]; [anArray removeObject: item]; [anArray removeLastObject]; 
 NSMutableArray *arrayThatYouCanRemoveObjects = [NSMutableArray arrayWithArray:your_array]; [arrayThatYouCanRemoveObjects removeObjectAtIndex:your_object_index]; [your_array release]; your_array = [[NSArray arrayWithArray: arrayThatYouCanRemoveObjects] retain]; 

就是这个

如果你不拥有your_array(即它是autoreleased)删除释放和保留消息

这个类别可能是你的口味。 但! 节省用法; 因为我们正在转换到一个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 

以下是使用键值编码的更多function方法:

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

做了一个类似mxcl的,但是这个稍微快一点。

我的testing显示〜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; } 

使用此方法从NSArray删除Object

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