2012-01-04 76 views
1

因此,我經常檢查碰撞檢測,並且每當敵人死亡時,我將它從我正在迭代的數組中移除。iPhone遊戲:枚舉敵人

這是給我enmueration變異異常,解決這個問題的正常方法是什麼?人們談論製作數組的副本,但是當我重複它的時候,每一小部分的想法似乎都很荒謬。

+2

如何將這些元素添加到另一個數組中去除。然後,枚舉原始數組後,只需從原始(第一個)數組中刪除第二個數組的所有元素。 – Till 2012-01-04 16:44:42

回答

3

我同意Till的評論。做這樣的事情,如果self.enemies是你原來的可變數組

NSArray * enemiesToRemove = [[NSMutableArray alloc] init]; 
for (Enemy * enemy in self.enemies) { 
    if ([enemy colidesWithBullet]) { 
     [enemiesToRemove addObject:enemy]; 
    } 
} 
[self.enemies removeObjectsInArray:enemiesToRemove]; 
[enemiesToRemove release]; 
+0

而不是寫第二個'for'循環,你可以這樣做:'[self.enemies removeObjectsInArray:enemiesToRemove];' – jlehr 2012-01-04 17:49:30

+0

該死的,完全!我要編輯我的答案,thx :) – Zoleas 2012-01-05 08:27:36

1

基本上,你不能刪除或添加數組枚舉,因爲你似乎經常迭代數組,因此你可能會得到這個異常很多,一種選擇是鎖定你的數組,同時迭代,而同時你可以在數組上使用@synchronized塊來移除,這將保證你在迭代時不會修改數組...這種方法的缺點是你將會有迭代和添加/刪除操作,等待對方...

@synchronized(myArray) 
{ 
    //iterate through myArray 
} 

@synchronized(myArray) 
{ 
    //mutate the array 
} 
1

刪除從一個數組,你是itterating過可能會非常棘手的項目。你可以做一些像Zoleas建議的事情,或者你可以避免枚舉列表並從最後一個元素開始,然後向後檢查第一個元素,刪除需要刪除的元素。這樣你可以確保你永遠不會刪除一個影響後面元素索引的元素。

for(int i=[array count]-1; i >=0 :i--) 
{ 
    bool needsRemoved = /* your code here */; 
    if (needsRemoved) 
    { 
    [ary removeObjectAtIndex:i] 
    } 
} 
+0

這很聰明:) – Zoleas 2012-01-05 08:28:44