2012-02-08 2 views
2

Я использую один NSMutableArray с тем же строковым объектом.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 соответствует строке или адресу.

ответ

4

Это потому, что вы используете removeObject, который удаляет все объекты, которые «равны» в одном вы передаете в качестве за this Apple documentation:.

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

Вы видите на effects of literal strings здесь, где каждый из этих объектов @"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.

+1

Предупреждение Typo: 'removeObjectAtInded' должен иметь' x' в конце :-). –

+0

Дополнительная информация о строковых литералах: http://stackoverflow.com/a/25798/250164 –

+0

Исправление: метод removeObject не удаляет все одинаковые объекты. Скорее, он удаляет только одно его появление. Чтобы удалить все «равные» объекты, мы должны использовать метод removeObjectIdendicalTo. – santobedi

3

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

removeObject:

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

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

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