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

时间:2011-04-11 20:15:14

标签: ios objective-c iphone

我在我的应用中偶然发现了一个问题:我测试了对didReceiveMemoryWarning的{​​{1}}次来电,包括UIViewController的后续调用。

这曾经在我的应用程序的旧版本中正常工作,但现在在iPhone模拟器中无法正常工作: viewDidUnload不再被召唤了。

这是因为调用didReceiveMemoryWarning中的[NSNotificationCenter defaultCenter] removeObserver:self](自我是UIViewController)来取消注册我在viewWillDisappear中添加的一些生命周期通知。

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

这种行为是否符合设计要求?我找不到一个指出的参考/文档,在UIViewController中调用didReceiveMemoryWarning会破坏标准的memoryWarning处理。

2 个答案:

答案 0 :(得分:16)

是的,这是设计的。

这种行为一点也不让我感到惊讶。 UIViewController的实现是不透明的,所以没有办法确定它是使用UIApplicationDidReceiveMemoryWarningNotification动作注册didReceiveMemoryWarning的实例,但这肯定是有道理的。

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

答案 1 :(得分:4)

[NSNotificationCenter defaultCenter] removeObserver:observer]取消注册observer以获取之前已注册的所有通知(包括系统通知)。 您可以使用removeObserver:name:object:方法取消订阅单个通知。