NSMutableArray正在删除具有相同字符串的所有对象

时间:2012-02-08 14:16:47

标签: iphone objective-c 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个对象时,它会用“hi”字符串删除所有对象。 我不明白为什么会发生这种情况 我的疑问是在删除对象时,NSMutableArray匹配字符串或地址。

3 个答案:

答案 0 :(得分:4)

这是因为您正在使用removeObject删除与您传入的对象“相同”的所有对象。根据this Apple documentation

  

此方法使用indexOfObject:来查找匹配项,然后删除   他们通过使用removeObjectAtIndex:。因此,确定匹配   对象对isEqual:消息的响应的基础。如果   array不包含anObject,该方法没有效果(尽管它   确实会产生搜索内容的开销。)

您在这里看到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 :(得分:3)

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

  

removeObject:

     

删除给定对象数组中的所有匹配项。

这正是您所看到的行为。如果要删除特定位置的对象,则需要removeObjectAtIndex:

答案 2 :(得分: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);