我正在使用一个带有相同字符串对象的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匹配字符串或地址。
答案 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)
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);