因此,我經常檢查碰撞檢測,並且每當敵人死亡時,我將它從我正在迭代的數組中移除。iPhone遊戲:枚舉敵人
這是給我enmueration變異異常,解決這個問題的正常方法是什麼?人們談論製作數組的副本,但是當我重複它的時候,每一小部分的想法似乎都很荒謬。
因此,我經常檢查碰撞檢測,並且每當敵人死亡時,我將它從我正在迭代的數組中移除。iPhone遊戲:枚舉敵人
這是給我enmueration變異異常,解決這個問題的正常方法是什麼?人們談論製作數組的副本,但是當我重複它的時候,每一小部分的想法似乎都很荒謬。
我同意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];
基本上,你不能刪除或添加數組枚舉,因爲你似乎經常迭代數組,因此你可能會得到這個異常很多,一種選擇是鎖定你的數組,同時迭代,而同時你可以在數組上使用@synchronized塊來移除,這將保證你在迭代時不會修改數組...這種方法的缺點是你將會有迭代和添加/刪除操作,等待對方...
@synchronized(myArray)
{
//iterate through myArray
}
@synchronized(myArray)
{
//mutate the array
}
刪除從一個數組,你是itterating過可能會非常棘手的項目。你可以做一些像Zoleas建議的事情,或者你可以避免枚舉列表並從最後一個元素開始,然後向後檢查第一個元素,刪除需要刪除的元素。這樣你可以確保你永遠不會刪除一個影響後面元素索引的元素。
for(int i=[array count]-1; i >=0 :i--)
{
bool needsRemoved = /* your code here */;
if (needsRemoved)
{
[ary removeObjectAtIndex:i]
}
}
這很聰明:) – Zoleas 2012-01-05 08:28:44
如何將這些元素添加到另一個數組中去除。然後,枚舉原始數組後,只需從原始(第一個)數組中刪除第二個數組的所有元素。 – Till 2012-01-04 16:44:42