Objective c N通知中心不工作,我做错了什么?

Objective c N通知中心不工作,我做错了什么?,objective-c,xcode,exc-bad-access,nsnotificationcenter,Objective C,Xcode,Exc Bad Access,Nsnotificationcenter,我正在使用cocos3D(但这并不重要……) 在GameLogic中,我有一个简单的通知处理程序(也在标题中声明) 在MyObject中,当时间到了,我调用这个方法 -(void)dispatchEvent { NSLog(@"SHOULD DISPATCH THE EVENT"); [[NSNotificationCenter defaultCenter] postNotificationName:@"objectMoved" object:self]; NSLog(@

我正在使用cocos3D(但这并不重要……)

在GameLogic中,我有一个简单的通知处理程序(也在标题中声明)

在MyObject中,当时间到了,我调用这个方法

-(void)dispatchEvent
{
    NSLog(@"SHOULD DISPATCH THE EVENT");
    [[NSNotificationCenter defaultCenter] postNotificationName:@"objectMoved" object:self];
    NSLog(@"EVENT DISPATCHED");
}
但它在突出显示postNotificationName行时崩溃。。。 错误是EXC_BAD_ACCESS,意思是(如果我理解正确的话)有一些对解除分配对象的引用


发生了什么?

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

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

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

第二个最可能的原因是您在发布通知之前调用removeObserver:。这在dealloc中最为常见(如果您观察到任何情况,应该始终调用
removeObserver
)。这里的错误是,您的观察对象在通知之前已解除分配


在这里,您的代码对象没有在MyScene上的
addObserver

注释
addObserver
行中正确设置,方法
dispatchEvent
一直执行到结束,没有任何错误,一切仍然正常。。。(除了
testHandler:
显然被忽略)我仍然收到相同的错误。。我尝试在
addOserver
上使用
nil
postNotificationName
和这两个(在
object
参数上),但仍然不起作用可能您的观察者(MyScene
实例)已被释放。确保在
dealoc
过程中将其作为观察者删除。即使我在
dealoc
方法上注释或取消注释
removeObserver
,我仍然会收到错误。。。无论如何,我不确定你在说什么:为什么«对象设置不正确»?为什么我«没有实际调用addObserver…»[[NSNotificationCenter defaultCenter]addObserver:gLogic选择器:@selector(testHandler:)name:@“objectMoved”对象:nil];将其添加到ViewDidLoad方法中
-(void)dispatchEvent
{
    NSLog(@"SHOULD DISPATCH THE EVENT");
    [[NSNotificationCenter defaultCenter] postNotificationName:@"objectMoved" object:self];
    NSLog(@"EVENT DISPATCHED");
}
[[NSNotificationCenter defaultCenter] addObserver:gLogic 
                                         selector:@selector(testHandler:) 
                                             name:@"objectMoved" 
                                           object:nil];