NSMutableArray удаляет все объекты с одинаковой строкой - PullRequest
2 голосов
/ 08 февраля 2012

Я использую один NSMutableArray с тем же строковым объектом.

Вот код

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);

Когда я пытаюсь удалить 3-й объект массива, он удаляет весь объект с "привет"строка.Я не понимаю, почему это происходит.
Я сомневаюсь, удаляя объект, строку соответствия NSMutableArray или адрес.

Ответы [ 3 ]

4 голосов
/ 08 февраля 2012

Это потому, что вы используете removeObject, который удаляет все объекты, "равные" тому, который вы передаете. Согласно этой документации Apple :

Этот метод использует indexOfObject: для поиска совпадений, а затем удаляет их с помощью removeObjectAtIndex :. Таким образом, совпадения определяются на основа ответа объекта на сообщение isEqual :. Если массив не содержит anObject, метод не имеет никакого эффекта (хотя требует затрат на поиск содержимого).

Вы видите эффекты буквальных строк здесь, где каждый из этих @"hi" объектов окажется одним и тем же объектом, только что добавленным много раз.

Что вы действительно хотите сделать, это:

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

Тогда вы специально удаляете объект с индексом 2.

3 голосов
/ 10 февраля 2012
NSMutableArray *arr = [[NSMutableArray alloc]initWithObjects:@"hello",@"hi",@"hi",@"hi",@"hi",@"hi",@"hi",@"hi",@"hi",@"hi",@"hi",@"hi",@"hi",nil];
NSUInteger obj = [arr indexOfObject:@"hi"];  //Returns the lowest integer of the specified object
[arr removeObjectAtIndex:obj];  //removes the object from the array
NSLog(@"%@",arr);
3 голосов
/ 08 февраля 2012

Согласно https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSMutableArray_Class/Reference/Reference.html

removeObject:

Удаляет все вхождения в массиве данного объекта.

это именно то поведение, которое вы видите. Если вы хотите удалить объект в определенной позиции, вы хотите removeObjectAtIndex:.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...