전무 나는 코드의 아주 간단한 라인 오브젝티브 C에있어 "을 사용! 때때로EXC_BAD_ACCESS OBJ =
if ((selectedEntity != nil) && [selectedEntity isKindOfClass:[MobileEntity class]])
나는이 라인에, 게임 충돌을 알 수없는 이유 EXC-BAD-ACCESS가있는 코드의 경우 일반적으로 무언가가 경기장에서 제거 될 때가 된 것 같습니다. 이 인 경우 추측하겠습니다. selectedEntity가 dealloc 된 다음이 결과가 표시됩니다. 존재하는 엔티티를 선택하는 것은 불가능합니다 (그러나 누가 내 코드에서 실제로 사실이 아님을 알고 있습니다 ...), 내가 특별히 거기에 있는지 확인하기 위해 이인지 확인하기 전에 selectedEntity 여기에 문제가 있으면 안됩니다. Objective-C는 부울 short-citcuiting을 지원하기로되어 있지만 EDIT가 아닌 것처럼 보입니다. 단락이 문제와 관련이없는 것처럼 보입니다.
또한이 코드 블록 주위에 @ try/@ catch를 넣습니다. 왜냐하면 나는 매번 폭발하는 것을 알았지 만 무시당하는 것 같습니다 (EXC-BAD-ACCESS가 될 수 없다고 생각합니다.) 잡힌).
기본적으로 나는 누군가가 이걸 잡아서 버릴 수있는 방법을 알고 있는지 궁금해하고 있습니다. 왜냐하면 (게임 충돌을 일으키지 않는 한이 오류를 신경 쓰지 않기 때문에) 왜 그 이유를 설명 할 수 있습니까? 그것은 일어날 수 있습니다. Objective-C가 "nil"값으로 이상한 일을한다는 것을 알기 때문에 객체 포인터 나 nil이 아닌 이상한 공간을 가리키고 있다고 생각합니다.
편집 : 명확히하기 위해 아래 코드가 잘못되었다는 것을 알고 있습니다. 내 프로그램에서 추측 한 것입니다. 나는 이것이 문제를 야기하는지 물어 보았다. :-)
EDIT : 지워지기 전에 개체를 선택할 수있는 프린지 케이스가있는 것처럼 보입니다. 그래서, 코드의 진행은 다음과 같이 간다 나타납니다
그래서 오토 릴리즈 풀은 아직 발표되지 않았기 때문에, 객체가 nil이 아니라 그것의 유지 카운트가 그래서입니다 0입니다 같은데요selectedEntity = obj;
NSAutoreleasePool *pool = ...;
[obj release];
if (selectedEntity != nil && etc...) {}
[pool release];
어쨌든 액세스 할 수 없거나 그 라인을 따라 무엇인가?
또한 내 게임은 단일 스레드이므로 스레딩 문제가 아닙니다.
편집 : 두 가지 방법으로 문제를 수정했습니다. 첫째, 나는 그 프린지 경우 엔티티의 선택을 허용하지 않았다. 둘째, 단지 호출 [엔티티 removeObjectAtIndex : 내가] 대신 : 그냥 당신의 변수에 nil을 할당되어 있는지 확인
//Deselect it if it has been selected.
if (entity == selectedEntity)
{
selectedEntity = nil;
}
[entities removeObjectAtIndex:i];
(코드가 삭제됩니다 어떤 요소를 제거하기 위해), 나는 그것을 변경 jib이 제안한대로 당신이 그것을 풀어주는 것과 동시에.
-removeObjectAtIndex : 보유 횟수를 감소시키고 0에 도달하면 개체 할당을 취소합니다. 좀비가이를 감지 할 것입니다. 따라서 마지막 편집에서 nil을 지정하면 문제가 해결됩니다. – bbum