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

似乎您有两个或更多实例MyObject,一个是您在其中创建的initializeScene,另一个是发布通知的。nil作为对象参数传递应该可以工作:

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

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

第二个最可能的原因是您在发布通知之前调用了 removeObserver:。这在 dealloc 中最常见(removeObserver如果您曾经观察到任何东西,应该总是调用它)。这里的错误是您的观察对象在通知之前已释放。

在您的代码对象中未正确设置addObserver

于 2012-05-25T10:07:52.167 回答