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]; }