Comment supprimer un élément de NSArray.
Réponses
Trop de publicités?NSArray n'est pas modifiable, c'est-à-dire que vous ne pouvez pas le modifier. Vous devriez jeter un oeil à NSMutableArray . Consultez la section "Suppression d'objets", vous y trouverez de nombreuses fonctions vous permettant de supprimer des éléments:
[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];
C'est à peu près ça
si vous ne possédez pas your_array (c'est-à-dire qu'il est auto-publié), supprimez la publication et conservez les messages
Cette catégorie peut être à votre goût. Mais! Soyez économe avec son utilisation; puisque nous convertissons en NSMutableArray et inversement, ce n'est pas du tout efficace.
@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];
[newArray removeObject:obj];
return [NSArray arrayWithArray:mutableArray];
}
@end
Fait une catégorie comme mxcl, mais c'est légèrement plus rapide.
Mes tests montrent une amélioration d'environ 15% (je peux me tromper, vous pouvez comparer les deux vous-même).
Fondamentalement, je prends la partie de la matrice qui se trouve devant l'objet et la partie derrière et les combine. Donc exclure l'élément.
- (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;
}