NSNotificationCenter崩溃

时间:2013-08-09 21:18:16

标签: ios cocoa-touch uikit nsnotificationcenter

在我的应用程序中,我会收听键盘通知:

  [[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardWillShow)
                                             name:UIKeyboardWillShowNotification
                                           object:nil];

我刚删除了导致我的应用程序崩溃的错误

我有一个带有UI的模态视图(每次呈现时都会被销毁并重新创建。

在我添加这行代码之前,我第二次使用它时遇到了崩溃:

[[NSNotificationCenter defaultCenter] removeObserver:self];

任何人都知道为什么不删除已解除分配对象的观察者会导致崩溃?

3 个答案:

答案 0 :(得分:3)

这是因为当您收到通知时,如果您没有以观察者的身份删除您的类,它仍会尝试调用该方法。但是,由于该对象已完全取消分配并销毁,因此您将获得EXC_BAD_ACCESS。

答案 1 :(得分:1)

在类的dealloc方法中删除任何观察者是个好主意。否则,通知将发送到不再存在的对象,该对象崩溃。

答案 2 :(得分:1)

NSNotificationCenter维护对可能已取消或可能未解除绑定的对象的引用。崩溃发生在第二次,因为NSNotificationCenter不知道旧的UIViewController已经完全释放。