2010-08-05 4 views
1

저는 진지한 프로그래밍에 익숙하지 않으므로 제 멍청이를 용서해주십시오.하지만 혼자서는 이것을 이해하지 못했습니다.안전하게 NSMutableSet (cocos2d-iphone)에서 객체를 제거하는 방법

나는 cocos2d-iphone으로 게임을 만들고 있습니다. 단위체, 건물, 로켓트 등 여러 가지 NSMutableSets가있는 장면 개체가 있습니다. 이러한 NSMutableSets에서 개체를 제거하는 데 문제가 있습니다. 총알 객체가 다른 것들 사이를-ED를 init이 될 때이 같은 손상을해야 할 대상 검색 : 그것은 손상을 유지하기 위해 충분한 HP가없는 경우

... 
for (RXUnit * unit in targetSet) { 
    if (ccpDistance(unit.position, rayPoint) < 20) { 
    ... 
    [unit damageSelfBy:damage]; 
    ... 
    } 
} 
... 

[unit damageSelfBy:damage] 방법은 단위를 죽인다. 당시 총에 맞은 총알이 단위는

[scene.units removeObject:self]; 

이 줄을 사용할 때마다

(scene.units 위의 루프에서 targetSet 같은 NSMutableSet입니다) : 무엇보다도 이것이 않습니다 세트에서 제거되면 제대로 초기화되지 않습니다. bullet init 메소드는 위에 표시된 for 루프까지 실행합니다 (예, 단위가 손상되어 이전 글 머리 기호에 의해 제거됩니다). 그러나 init 메소드에서이 루프 다음에 오는 다른 것은 실행되지 않습니다.

놀랍게도 응용 프로그램은 그 총알이 붙은 것을 제외하고는 눈에 띄는 효과가 없으므로 정상적으로 계속 실행됩니다. 콘솔에 경고/오류가 표시되지 않고 컴파일 중 경고가 표시되지 않습니다.

장면의 업데이트 메서드에 실제 제거 코드를 넣어서 장치가 집합에서 제거되는 시간을 지연 시키려고했으나 도움이되지 않습니다.

나는이 문제를 숨기기 위해 못생긴 해킹을 만들 수 있다고 생각하지만, 나중에 엉덩이에 나를 물릴 것이라고 확신한다. 그리고 무엇이 어떻게 진행되고 있고, 어떻게 적절히 대처할 수 있는지 이해하고 싶습니다.

어떤 도움이나 아이디어라도 높이 평가합니다. NSMutableSets에 게임 객체를 저장하지 않아야할까요?

답변

3

설정된 컨테이너가 개체에 대한 유일한 참조입니까? 메서드를 실행하는 동안 객체를 dealloc하면 정의 된 동작이 있는지 확실하지 않습니다. "사망"으로 표시 한 다음 나중에 정리 단계를 수행해야 할 수도 있습니다.

+0

그래서, 나는 또 다른 간접 추가 지금 죽어가는 유닛이 코드 장면 객체의 메소드를 호출 '[objectsToRemove addObject :있는 NSArray의 arrayWithObjects : aObject, ASET, 전무]]에서 다음' 그리고' [장면 업데이트 : (ccTime) dt]'첫 줄은 다음과 같습니다. for (NSArray * array in objectsToRemove) { [array objectAtIndex : 1] removeObject : [array objectAtIndex : 0]]; } [objectsToRemove removeAllObjects]; ' 아직도이 특별한 트릭이 왜 작동하는지 모르지만 문제가 해결됩니다. 추신 : – raquo

+0

죄송합니다. 코드 블록 서식이 작동하지 않는 이유를 알아 내려고 노력했지만 주석을 편집 할 수 없게되었습니다. 도와 주셔서 감사합니다! – raquo

3

집합에서 개체를 제거하고 그 집합이 개체에 대한 유일한 참조 인 경우 개체를 바로 할당 해제 할 수 있습니다. 잠시 생각해보십시오. 실행중인 메소드가 일 수 있습니다. 이 지금 사라집니다.. 그건 나쁜거야.

지연 제거가 작동하는 이유는 다음과 같습니다. 그건 속임수가 아니야. 객체 사용을 마칠 때까지 기다리는 중입니다. 다음에을 삭제하고 있습니다. 더 좋은 방법이 objectsToRemove 트릭보다하지만,있다 :

[self retain]; 
[self autorelease]; 
[scene.units removeObject:self]; 

autorelease는 지연 release 메시지가 다음 autoreleaseretain를 사용하여 객체에 때 실행 루프 마감, 그래서 전송 될 것입니다, 당신은 객체를 방지 두 번째가 사라지는 것을 막기 위해 scene.units에서 삭제되었습니다.

+0

Sigh. 불행히도 작동하지 않습니다 - 총알이 다시 붙어 있습니다. 솔직하게, 나는 이것이 작동하지 않는 이유와 나의 이상한 간접적 인 지시가 이해하지 못한다. 어쩌면 내 것이 더 많은 지연을 제공하기 때문에 - 약 1/45 초 ... 어쨌든 정말 고마워! – raquo

관련 문제