NSNotificationCenter removeObserver:取消注册VC以接收内存警报通知吗?

mar*_*cus 12 iphone objective-c ios

我只是偶然关于我的应用程序的一个问题:我测试了didReceiveMemoryWarning呼叫转移至UIViewController包括后续的呼叫viewDidUnload.

这曾经在我的应用程序的旧版本中正常工作,但现在在iPhone模拟器中无法正常工作: didReceiveMemoryWarning不再被调用.

这是通过调用造成[NSNotificationCenter defaultCenter] removeObserver:self]viewWillDisappear(自我作为的UIViewController)来注销了一些生命周期通知我并在补充viewDidAppear.

该全局removeObserver:调用不仅删除了我添加的通知,而且显然系统的UIApplicationDidReceiveMemoryWarningNotification通知也导致didReceiveMemoryWarning调用UIViewController .

这种行为是设计的吗?我找不到一个指出的参考/文档,removeObserver:在UIViewController 中调用会破坏标准的memoryWarning处理.

XJo*_*nes 16

是的,这是设计的.

这种行为一点也不让我感到惊讶.UIViewController中的实现是不透明的,所以没有办法确切知道它是注册的实例为UIApplicationDidReceiveMemoryWarningNotificationdidReceiveMemoryWarning行动,但肯定会有意义.

作为一般规则,[[NSNotificationCenter defaultCenter] removeObserver:self]在任何地方使用都是不好的做法dealloc.这是因为,正如您所发现的,在超类实现中可能存在不可预测的副作用.如果您遵循仅针对您注册的特定通知取消注册的约定,则可以更加可预测且更容易调试/维护代码.