我正在使用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意思(如果我理解正确的话)有一些对解除分配对象的引用.......
发生了什么事?
答案 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