我在我的应用中偶然发现了一个问题:我测试了对didReceiveMemoryWarning
的{{1}}次来电,包括UIViewController
的后续调用。
这曾经在我的应用程序的旧版本中正常工作,但现在在iPhone模拟器中无法正常工作:
viewDidUnload
不再被召唤了。
这是因为调用didReceiveMemoryWarning
中的[NSNotificationCenter defaultCenter] removeObserver:self]
(自我是UIViewController)来取消注册我在viewWillDisappear
中添加的一些生命周期通知。
全局viewDidAppear
调用不仅删除了我添加的通知,而且显然系统的UIApplicationDidReceiveMemoryWarningNotification通知也导致调用UIViewController的removeObserver:
。
这种行为是否符合设计要求?我找不到一个指出的参考/文档,在UIViewController中调用didReceiveMemoryWarning
会破坏标准的memoryWarning处理。
答案 0 :(得分:16)
是的,这是设计的。
这种行为一点也不让我感到惊讶。 UIViewController的实现是不透明的,所以没有办法确定它是使用UIApplicationDidReceiveMemoryWarningNotification
动作注册didReceiveMemoryWarning
的实例,但这肯定是有道理的。
作为一般规则,在[[NSNotificationCenter defaultCenter] removeObserver:self]
的任何地方使用dealloc
是不好的做法。这是因为,正如您所发现的,在超类实现中可能存在不可预测的副作用。如果您遵循仅针对您注册的特定通知取消注册的惯例,则可以更加可预测且更容易调试/维护代码。
答案 1 :(得分:4)
[NSNotificationCenter defaultCenter] removeObserver:observer]
取消注册observer
以获取之前已注册的所有通知(包括系统通知)。
您可以使用removeObserver:name:object:
方法取消订阅单个通知。