【问题标题】:Obj-c NSNotificationCenter Bad Accessobj -c NSNotificationCenter 访问错误
【发布时间】:2013-11-20 17:50:44
【问题描述】:

所以我有一个 CCLayer 对象,它有一个子 CCSprite 对象,当条件发生时(由更新方法检测到),调用 CCSprite 的一个方法,该方法本身调用以下内容

[[NSNotificationCenter defaultCenter] postNotificationName:@"mymethod" object:nil];

CCLayer 然后继续运行

[node removeFromParentAndCleanup:YES];

让 CCSprite 删除它。 CCLayer 在 init 上也调用了以下代码

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mymethod) name:@"mymethod" object:nil];

现在 10 次中有 9 次这很好并且可以按预期工作,但是偶尔我会收到一个 bad_access 指向通知帖子行。

我从阅读其他人有类似问题的猜测是,这是因为子对象已被删除,但我不知道该怎么做,因为它在它之前被调用被删除。

是否会发生一些事情来延迟发布通知的调用,并且在对象被移除后最终会被调用,或者我是在找错树了吗?

更新

在上面添加了删除代码,如果我注释掉删除和清理行,它就不会发生。

【问题讨论】:

  • 你能把删除孩子的代码贴出来吗?
  • 如果父类最终是 cocos2d 类,您可能希望在 onExit 方法中发布。 onExit 在“removeFromParent”循环期间被调用,并在实际删除之前执行。不要忘记 [super onExit]。
  • 您是否尝试过或“移除”该对象,只是为了看看它是否仍然发生?
  • 感谢您的快速回复,请参阅上面的修改。

标签: ios objective-c cocos2d-iphone nsnotificationcenter


【解决方案1】:

您需要移除观察者。观察者不会被自动删除,因此如果您不删除它们,那么您会将它们堆叠在内存中,这可能是它稍后中断的原因。

【讨论】:

  • 非常感谢,我已经在我的dealloc方法中添加了以下内容[[NSNotificationCenter defaultCenter] removeObserver:self];我会测试一下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多