4

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

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

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

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

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

[[NSNotificationCenter defaultCenter] removeObserver:self];

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

4

3 回答 3

3

这是因为当您收到通知时,如果您没有将您的类作为观察者删除,它仍然会尝试调用该方法。但是,由于对象已被完全释放和销毁,您会得到一个 EXC_BAD_ACCESS。

于 2013-08-09T21:21:44.277 回答
1

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

于 2013-08-09T21:21:33.230 回答
1

NSNotificationCenter维护对可能或可能未释放的对象的引用。第二次发生崩溃是因为 NSNotificationCenter 不知道旧的 UIViewController 已经完全释放。

于 2013-08-09T21:22:19.250 回答