2013-11-21 88 views
3

我有一個名爲playerSkillsByLevelSnapshots的獨特nsmutablearray的nsarray。在下面的代碼開始時,數組包含6個對象。從nsarray中移除一個對象將全部移除

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

當我通過上面的最後一行時,數組包含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:方法。

+0

這是我首先想到的,但playerSkillsByLevelSnapshots \t的NSMutableArray * \t 0x07e352d0包含:[0] \t ID \t 0x161040f0,[1] \t ID \t 0x07ea5440,[2] \t ID \t 0x07ea75c0,[3] \t ID \t 0x161e8440, [4] \t id \t 0x1615f000,[5] \t id \t 0x07ee50a0 –

+0

事實上,我確實會拷貝每個進入容器數組的數組。 –

+0

@NaseivaKhan難道所有的數組都是相等的嗎? (我不知道它是否會有很大的不同,因爲我從來沒有試過比較'NSArray'是否相等)。你爲什麼更喜歡'removeObject'到'removeObjectAtIndex'? – dasblinkenlight