그래서 충돌 감지를 계속 확인하고 있습니다. 적을 죽일 때마다 배열에서 제거하고 반복합니다.iPhone 게임 : 적을 열거하기
이것은 내가 돌연변이 돌연변이 예외를주고 있는데, 이것을 해결하는 일반적인 방법은 무엇입니까?
사람들은 배열의 복사본을 만드는 것에 대해 이야기했지만, 반복 할 때마다 그 아이디어가 우스꽝스럽게 보입니다.
그래서 충돌 감지를 계속 확인하고 있습니다. 적을 죽일 때마다 배열에서 제거하고 반복합니다.iPhone 게임 : 적을 열거하기
이것은 내가 돌연변이 돌연변이 예외를주고 있는데, 이것을 해결하는 일반적인 방법은 무엇입니까?
사람들은 배열의 복사본을 만드는 것에 대해 이야기했지만, 반복 할 때마다 그 아이디어가 우스꽝스럽게 보입니다.
나는 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];
기본적으로 배열을 열거하는 동안 배열에서 제거 또는 추가 할 수 없습니다. 배열을 자주 반복하는 것처럼 보이기 때문에 반복적으로 배열을 잠그는 동안 한 번만이 예외가 발생합니다. 배열에서 @synchronized 블록을 사용하여 제거하면 배열을 반복하는 동안 배열을 수정하지 않을 것입니다.이 접근 방식에서는 배열이 반복되고 추가/제거 작업이 서로 기다리는 것입니다.
@synchronized(myArray)
{
//iterate through myArray
}
@synchronized(myArray)
{
//mutate the array
}
경우, 그 같은 작업을 수행합니다. Zoleas가 제안한 것과 같은 일을하거나 목록을 열거하지 않고 마지막 요소에서 시작하여 제거해야하는 요소를 제거하는 첫 번째 요소를 역으로 확인할 수 있습니다. 이렇게하면 나중 요소의 색인에 영향을 줄 요소를 절대로 제거하지 않도록 할 수 있습니다.
for(int i=[array count]-1; i >=0 :i--)
{
bool needsRemoved = /* your code here */;
if (needsRemoved)
{
[ary removeObjectAtIndex:i]
}
}
그건 영리하다. :) – Zoleas
다른 요소를 제거하여 다른 배열로 제거하는 것은 어떻습니까? 그런 다음 원래 배열을 열거 한 후 원래 배열 (첫 번째 배열)에서 두 번째 배열의 모든 요소를 제거하기 만하면됩니다. – Till