2012-01-04 3 views
1

그래서 충돌 감지를 계속 확인하고 있습니다. 적을 죽일 때마다 배열에서 제거하고 반복합니다.iPhone 게임 : 적을 열거하기

이것은 내가 돌연변이 돌연변이 예외를주고 있는데, 이것을 해결하는 일반적인 방법은 무엇입니까?

사람들은 배열의 복사본을 만드는 것에 대해 이야기했지만, 반복 할 때마다 그 아이디어가 우스꽝스럽게 보입니다.

+2

다른 요소를 제거하여 다른 배열로 제거하는 것은 어떻습니까? 그런 다음 원래 배열을 열거 한 후 원래 배열 (첫 번째 배열)에서 두 번째 배열의 모든 요소를 ​​제거하기 만하면됩니다. – Till

답변

3

나는 Till의 의견에 동의합니다. self.enemies 당신이 까다로울 수 이상 itterating되는 배열에서 항목을 제거하여 원래의 변경 가능한 배열

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

+0

젠장! 나는 내 대답을 편집 할거야. thx : – Zoleas

1

기본적으로 배열을 열거하는 동안 배열에서 제거 또는 추가 할 수 없습니다. 배열을 자주 반복하는 것처럼 보이기 때문에 반복적으로 배열을 잠그는 동안 한 번만이 예외가 발생합니다. 배열에서 @synchronized 블록을 사용하여 제거하면 배열을 반복하는 동안 배열을 수정하지 않을 것입니다.이 접근 방식에서는 배열이 반복되고 추가/제거 작업이 서로 기다리는 것입니다.

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

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

경우, 그 같은 작업을 수행합니다. Zoleas가 제안한 것과 같은 일을하거나 목록을 열거하지 않고 마지막 요소에서 시작하여 제거해야하는 요소를 제거하는 첫 번째 요소를 역으로 확인할 수 있습니다. 이렇게하면 나중 요소의 색인에 영향을 줄 요소를 절대로 제거하지 않도록 할 수 있습니다.

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

그건 영리하다. :) – Zoleas