2014-10-05 1 views
0

나는 내 CCNodes가있는 NSMutableArray을 가지고있다. [scene addChild:][CCNode removeFromParentAndCleanUp:YES]을 사용하여 CCScene에 페인트 칠 및 페인트 칠을하고 싶습니다. 내 개체에 부모 개체가 있고 다른 개체에서 동시에 삭제 된 경우 검사 할 때 내 문제가 나타납니다. 이 코드를 볼 수 있으며, 항상 충돌 :CCNode가 Cocos2D 3.0에서 삭제 될 수있는 동안 부모를 가지고 있는지 확인

for(int y = negativeY; y < positiveY; y++){ 
    for(int x = negativeX; x < positiveX; x++){ 
     if([[self.rockArray objectAtIndex:y] objectAtIndex:x] != nil){ //checking if object is not null 
      if([[[self.rockArray objectAtIndex:y] objectAtIndex:x] parent] == nil){ //Crashes here! 
       NSLog(@"Rock is not visible. Painting it"); 
       [listener addChild:[[self.rockArray objectAtIndex:y] objectAtIndex:x]]; 
      }else{ 
       NSLog(@"Rock is already visible."); 
      } 
     } 
    } 
} 

로그 메시지가

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSNull parent]: unrecognized selector sent to instance 0x351d6b0' 어쩌면 우리가 Semaphores를 사용하여이 문제를 해결할 수있다? (그렇다면 목표 C에 예제를 게시 해 주시겠습니까?)

감사합니다!

+1

그림 nil 포인터를 유지할 수 없기 때문에 확인하지 않아야합니다. 이것이 그 근원이 될 것입니다. – YvesLeBorg

+1

참고 ... cocos2d API의 사용자로서 코드는 주 스레드에서 모든 것을 실행하므로 실제로 '같은 시간에'같은 것이 없습니다 ... 세마포어는 문제를 찾는 솔루션이 될 것입니다. 풀다. cocos2d 앱에 스레드를 추가하는 것은 열려있는 GL 때문에 완전히 권장되지 않습니다. – YvesLeBorg

+0

예, 내가 말했듯이 배열에는 NSNull 포인터가 있습니다. 문제는'[NSNull null] 대신에'nil '인지 검사하고 있었다. 고맙습니다. – aramusss

답변

3

이 같은 개체를 확인합니다

[[self.rockArray objectAtIndex:y] objectAtIndex:x] != [NSNull null]

을 보내기 parent 메시지를하기 전에.

어떤 이유로 배열의 객체가 CCNode이 아니지만 NSNullparent 선택기에 응답하지 않기 때문에 충돌이 발생합니다.

nil을의 경우 배열에 당신이 NSNull 인스턴스를 왜 컬렉션

+0

네, 그랬습니다. Afterall, '[NSNull null]! = nil'. 고맙습니다. – aramusss