46

如何从 NSArray 中删除项目。

4

7 回答 7

127

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

[anArray removeObjectAtIndex: index];
[anArray removeObject: item];
[anArray removeLastObject];
于 2009-11-13T10:51:31.317 回答
24
NSMutableArray *arrayThatYouCanRemoveObjects = [NSMutableArray arrayWithArray:your_array];

[arrayThatYouCanRemoveObjects removeObjectAtIndex:your_object_index];

[your_array release];

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

就是这样

如果您不拥有 your_array(即它是自动发布的),请删除发布并保留消息

于 2009-11-13T11:37:34.173 回答
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
于 2010-11-26T16:09:48.060 回答
18

这是使用键值编码的更实用的方法:

@implementation NSArray (Additions)

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

@end
于 2014-05-06T09:35:50.630 回答
4

Object使用NSArray此方法删除:

-(NSArray *) removeObjectFromArray:(NSArray *) array withIndex:(NSInteger) index {
    NSMutableArray *modifyableArray = [[NSMutableArray alloc] initWithArray:array];
    [modifyableArray removeObjectAtIndex:index];
    return [[NSArray alloc] initWithArray:modifyableArray];
}
于 2014-10-21T21:38:14.063 回答
3

做了一个像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;
}
于 2013-12-11T21:03:23.960 回答
0

正如其他人所建议的那样,NSMutableArray 有这样做的方法,但有时你被迫使用 NSArray,我会使用:

NSArray* newArray = [oldArray subarrayWithRange:NSMakeRange(1, [oldArray count] - 1)];

这样,oldArray 将保持原样,但将创建一个 newArray 并删除第一个项目。

于 2019-04-19T15:34:43.913 回答