2012-05-25 2 views
0

내가 cocos3D 함께 일하고 있어요 (하지만이 문제를하지 않습니다 ..)NSNotificationCenter가 작동하지 않습니다. 무엇을 잘못하고 있습니까?

@interface MyScene : CC3Scene 
{ 
    MyObject *theObject; 
    GameLogic *gLogic; 
} 
@implementation MyScene 
-(void)initializeScene 
{ 
    gLogic = [[[GameLogic alloc] init] autorelease]; 
    theObject = [[[MyObject alloc] init] autorelease]; 
    [self addChild:theObject]; 
    [[NSNotificationCenter defaultCenter] addObserver:gLogic 
              selector:@selector(testHandler:) 
               name:@"objectMoved" 
               object:theObject]; 
} 

내가 간단한 통지 핸들러 (또한 헤더에 선언)가 GameLogic에 ...

-(void)testHandler:(NSNotification*)notification 
{ 
    NSLog(@"Notification: %@", [notification name]); 
} 

이 시간 때 MyObject를에, 나는 오류가 EXC입니다

-(void)dispatchEvent 
{ 
    NSLog(@"SHOULD DISPATCH THE EVENT"); 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"objectMoved" object:self]; 
    NSLog(@"EVENT DISPATCHED"); 
} 

하지만이 postNotificationName 라인을 강조 충돌하는 ... 이 메서드를 호출 _BAD_ACCESS 의미는 (내가 이해한다면) 할당 취소 된 객체에 대한 참조가 있다는 것입니다 .......

무슨 일 이죠?

+0

에서 제대로 설정되어 있지 않은, 방법은'dispatchEvent'는 오류없이 마지막까지 실행되고, 모든 것이 여전히 제외하고 (... 작동 – Khalizar

답변

1

MyObject의 인스턴스가 2 개 이상 있고, 사용자가 initializeScene 내에 생성하는 인스턴스와 알림을 게시하는 인스턴스 인 것처럼 보입니다. 객체 매개 변수로 nil을 전달 작동합니다 :

[[NSNotificationCenter defaultCenter] addObserver:gLogic 
             selector:@selector(testHandler:) 
              name:@"objectMoved" 
              object:nil]; 
+0

여전히 같은 오류가 발생합니다 ..'addOserver','postNotificationName' 그리고 둘 다 ('object' 매개 변수에)'nil'을 사용하려했으나 여전히 작동하지 않습니다 – Khalizar

+0

아마도 여러분의 관찰자 (MyScene 인스턴스)가 할당 해제되었을 것입니다. 'dealloc' 동안 관찰자로 그것을 제거했는지 확인하십시오. – Stefan

0

가장 큰 원인은 당신이 실제로 addObserver:selector:name:object:를 호출하지 않을 것입니다. 거기에 로깅 줄이 없습니다. 코드가 실행되고 있습니까?

두 번째로 가능한 원인은 알림이 게시되기 전에 removeObserver :를 호출한다는 것입니다. 이것은 dealloc에서 가장 일반적으로 발생합니다 (아무 것도 관찰하지 않은 경우 항상 removeObserver을 호출해야 함). 여기서 오류는 관찰 전에 관찰 객체가 알림 전에 할당 취소 된 것입니다. 코드 객체 여기

이 MyScene에`addObserver` 라인을 주석 addObserver

+0

내가 'dealloc' 메쏘드에서'removeObserver'를 주석 처리하거나 주석을 제거하더라도 오류가 계속납니다 ... 어쨌든 당신이 말하는 것에 대해 확실하지 않습니다 :«객체가 제대로 설정되지 않았습니다»? 왜 내가 실제로 addObserver를 호출하지 않는가?» – Khalizar

+0

[[NSNotificationCenter defaultCenter] addObserver : gselector : @selector (testHandler :) name : @ "objectMoved"object : nil]; ViewDidLoad 메서드에이를 추가하십시오. –