从nsarray中删除一个对象会删除所有对象

时间:2013-11-21 22:25:50

标签: ios objective-c arrays nsmutablearray nsarray

我有一个名为nsmutablearray的nsarray:playerSkillsByLevelSnapshots。在下面的代码的开头,数组包含6个对象。

NSArray *anArray2 = [playerSkillsByLevelSnapshots objectAtIndex:index];
playerSkills = [NSMutableArray arrayWithArray:anArray2];
[playerSkillsByLevelSnapshots removeObject:anArray2];

当我逐步浏览上面的最后一行时,数组包含0个对象。任何人都可以向我解释为什么会这样。请注意,数组中没有重复的条目。

1 个答案:

答案 0 :(得分:8)

发生这种情况的唯一原因是,playerSkillsByLevelSnapshots数组的所有对象都是同一个数组。这是一个常见错误 - 当您在设置playerSkillsByLevelSnapshots数组时将相同的数组对象添加到循环中的可变数组时会发生这种情况,例如,如下所示:

NSMutableArray *playerSkillsByLevelSnapshots = [NSMutableArray array];
NSMutableArray *tmp = [NSMutableArray array];
for (int i = 0 ; i != 5 ; i++) {
    // add some objects, then...
    [playerSkillsByLevelSnapshots addObject:tmp];
    [tmp removeAllObjects]; // Prepare to the new cycle
}

您可以通过复制放入playerSkillsByLevelSnapshots

的数组来解决此问题

removeObject:方法的另一个问题是它从数组中删除所有与被删除的对象相同的对象,而不仅仅是第一个实例。如果您的playerSkillsByLevelSnapshots数组可能存储彼此相同的对象,请转而使用removeObjectAtIndex:方法。