如何从NSArray中删除项目。
NSArray不可变,也就是说,你不能修改它。你应该看看NSMutableArray。查看“删除对象”部分,您会发现有许多功能可以删除项目:
[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(即它已自动释放),请删除发布并保留消息
此类别可能符合您的口味。但!使用它是节俭的;因为我们正在转换为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
以下是使用键值编码的更实用的方法:
@implementation NSArray (Additions)
- (instancetype)arrayByRemovingObject:(id)object {
return [self filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF != %@", object]];
}
@end
制作了类似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;
}
使用此方法从Object
中删除NSArray
:
-(NSArray *) removeObjectFromArray:(NSArray *) array withIndex:(NSInteger) index {
NSMutableArray *modifyableArray = [[NSMutableArray alloc] initWithArray:array];
[modifyableArray removeObjectAtIndex:index];
return [[NSArray alloc] initWithArray:modifyableArray];
}
正如其他人所说,NSMutableArray有方法可以这样做,但有时你被迫使用NSArray,我会使用:
NSArray* newArray = [oldArray subarrayWithRange:NSMakeRange(1, [oldArray count] - 1)];
这样,oldArray保持不变,但是将删除第一个项目创建newArray。