How to remove an item from NSArray.
问题:
回答1:
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];
回答2:
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
回答3:
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
回答4:
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
回答5:
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]; }
回答6:
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; }