第二次将观察者添加到NSNotificationCenter会导致EXC_BAD_ACCESS

时间:2011-03-25 09:32:25

标签: cocoa ios macos nsnotificationcenter observer-pattern

假设情景:

在我的viewDidLoad方法中,我将视图控制器添加为自定义通知的观察者(例如,通知MyFooNotification)。稍后在加载视图的过程中,通知将被发布,控制器将对其进行处理。当我离开控制器时,我不会在viewDidUnload中删除观察者(故意)。下次打开视图时,观察者会再次添加,但现在当观察到的通知发布时 - 我得到EXC_BAD_ACCESS

任何人都可以解释为什么会这样。

P.S。我确实知道我应该在viewDidUnload删除它。我只是对较低级别的细节感到好奇。

1 个答案:

答案 0 :(得分:5)

最有可能的原因是原始视图控制器已被释放,因为它是从导航堆栈(或类似)中弹出的,但NSNotificationCenter仍然有对它的引用。因此,当再次发布通知时,NSNotificationCenter会尝试通知现在已解除分配的视图控制器,并因此获得EXC_BAD_ACCESS

如果将某个对象作为观察者添加到NSNotificationCenter,则需要确保在dealloc期间将其删除。