0

私はcocos3Dを使用しています(ただし、それは問題ではありません。)

@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では、時間になるとこのメソッドを呼び出します

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

しかし、postNotificationName行を強調表示するとクラッシュします...エラーはEXC_BAD_ACCESSであり、(私が正しく理解していれば)割り当て解除されたオブジェクトへの参照があることを意味します......。

何が起こっていますか?

4

2 に答える 2

1

のインスタンスが 2 つ以上あるようです。1 つは内部でMyObject作成してinitializeSceneおり、もう 1 つは通知を投稿しています。nilオブジェクトパラメータとして渡すとうまくいくはずです:

[[NSNotificationCenter defaultCenter] addObserver:gLogic 
                                         selector:@selector(testHandler:) 
                                             name:@"objectMoved" 
                                           object:nil];
于 2012-05-25T10:07:14.123 に答える
0

最も可能性の高い原因は、実際に呼び出していないことですaddObserver:selector:name:object:。そこにはログ行がありません。コードが実行されていると確信していますか?

2 番目に考えられる原因は、通知が投稿される前に removeObserver: を呼び出していることです。これは最も一般的には dealloc で行われます (これは、removeObserver何かを観察したことがある場合は常に呼び出す必要があります)。ここでのエラーは、監視オブジェクトが通知の前に割り当て解除されたことです。

ここでコードオブジェクトが正しく設定されていませんaddObserver

于 2012-05-25T10:07:52.167 に答える