2 votes

NSMutableArray supprime tous les objets avec la même chaîne

Je suis en train d'utiliser un NSMutableArray avec le même objet de type chaîne de caractères.

Voici le code

NSMutableArray *arr = [[NSMutableArray alloc]initWithObjects:@"hello",@"hi",@"hi",@"hi",@"hi",@"hi",@"hi",@"hi",@"hi",@"hi",@"hi",@"hi",@"hi",nil];
NSObject *obj = [arr objectAtIndex:2];    
[arr removeObject:obj];       
NSLog(@"%@",arr);

Lorsque j'essaie de supprimer le 3ème objet du tableau, il supprime tous les objets avec la chaîne "hi". Je ne comprends pas pourquoi cela se produit.
Je me demande si lors de la suppression de l'objet, NSMutableArray compare les chaînes ou les adresses.

4voto

mattjgalloway Points 24217

C'est parce que vous utilisez removeObject qui supprime tous les objets qui sont "égaux" à celui que vous passez. Comme le mentionne la documentation d'Apple :

Cette méthode utilise indexOfObject: pour localiser les correspondances et les supprime ensuite en utilisant removeObjectAtIndex:. Ainsi, les correspondances sont déterminées sur la base de la réponse d'un objet au message isEqual:. Si le tableau ne contient pas un objet donné, la méthode n'a aucun effet (bien qu'elle entraîne des frais de recherche dans le contenu).

Vous voyez les effets des chaînes littérales ici où chacun de ces objets @"hi" se révéleront être le même objet ajouté plusieurs fois.

Ce que vous voulez vraiment faire est ceci :

NSMutableArray *arr = [[NSMutableArray alloc]initWithObjects:@"hello",@"hi",@"hi",@"hi",@"hi",@"hi",@"hi",@"hi",@"hi",@"hi",@"hi",@"hi",@"hi",nil];
[arr removeObjectAtIndex:2];
NSLog(@"%@",arr);

Vous supprimez spécifiquement l'objet à l'index 2.

3voto

Gareth McCaughan Points 12261

Selon https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSMutableArray_Class/Reference/Reference.html

removeObject:

Supprime toutes les occurrences dans le tableau d'un objet donné.

ce qui correspond exactement au comportement que vous observez. Si vous voulez supprimer l'objet à une position particulière, vous voulez removeObjectAtIndex:.

3voto

Jacob Caraballo Points 897
NSMutableArray *arr = [[NSMutableArray alloc]initWithObjects:@"hello",@"hi",@"hi",@"hi",@"hi",@"hi",@"hi",@"hi",@"hi",@"hi",@"hi",@"hi",@"hi",nil];
NSUInteger obj = [arr indexOfObject:@"hi"];  //Renvoie l'entier le plus bas de l'objet spécifié
[arr removeObjectAtIndex:obj];  //supprime l'objet du tableau
NSLog(@"%@",arr);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X