How to remove an item from NSArray.
7 Answers
NSArray is not mutable, that is, you cannot modify it. You should take a look at NSMutableArray. Check out the "Removing Objects" section, you'll find there many functions that allow you to remove items:
[anArray removeObjectAtIndex: index];
[anArray removeObject: item];
[anArray removeLastObject];
1 Comment
NSMutableArray *arrayThatYouCanRemoveObjects = [NSMutableArray arrayWithArray:your_array];
[arrayThatYouCanRemoveObjects removeObjectAtIndex:your_object_index];
[your_array release];
your_array = [[NSArray arrayWithArray: arrayThatYouCanRemoveObjects] retain];
that's about it
if you dont own your_array(i.e it's autoreleased) remove the release & retain messages
Comments
This category may be to your taste. But! Be frugal with its usage; since we are converting to a NSMutableArray and back again, it's not at all efficient.
@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 Comment
Here's a more functional approach using Key-Value Coding:
@implementation NSArray (Additions)
- (instancetype)arrayByRemovingObject:(id)object {
return [self filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF != %@", object]];
}
@end
1 Comment
Made a category like mxcl, but this is slightly faster.
My testing shows ~15% improvement (I could be wrong, feel free to compare the two yourself).
Basically I take the portion of the array thats in front of the object and the portion behind and combine them. Thus excluding the element.
- (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;
}
2 Comments
NSArray* newArray = [NSArray array]; initialization here is redundant[self subarray...] part. @Michael Ozeryansky, if the obj is nil indexOfObject will return NSNotFound. I'm not sure what happens then but its probably not the right thing, thanks!Remove Object from NSArray with this Method:
-(NSArray *) removeObjectFromArray:(NSArray *) array withIndex:(NSInteger) index {
NSMutableArray *modifyableArray = [[NSMutableArray alloc] initWithArray:array];
[modifyableArray removeObjectAtIndex:index];
return [[NSArray alloc] initWithArray:modifyableArray];
}
Comments
As others suggested, NSMutableArray has methods to do so but sometimes you are forced to use NSArray, I'd use:
NSArray* newArray = [oldArray subarrayWithRange:NSMakeRange(1, [oldArray count] - 1)];
This way, the oldArray stays as it was but a newArray will be created with the first item removed.