NSNotificationCenter无法正常工作,我做错了什么?

时间:2012-05-25 09:59:22

标签: objective-c xcode exc-bad-access nsnotificationcenter

我正在使用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意思(如果我理解正确的话)有一些对解除分配对象的引用.......

发生了什么事?

2 个答案:

答案 0 :(得分:1)

似乎您有两个或更多MyObject个实例,您在initializeScene内创建的实例以及发布通知的实例。传递nil作为对象参数应该有效:

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

答案 1 :(得分:0)

最可能的原因是您实际上并未调用addObserver:selector:name:object:。你那里没有伐木线;你确定代码正在运行吗?

第二个最可能的原因是您在发布通知之前调用了removeObserver :.这最常见于dealloc(如果您曾经观察过任何内容,则应始终调用removeObserver)。这里的错误是你的观察对象在通知之前已经解除分配。

此处您的代码对象未在addObserver

中正确设置