也许这是一个不好的做法,但是根据我阅读的文档,我得到了在viewDidLoad方法中的某些情况下初始化对象的建议,并在viewDidUnload中将其设置为nil。
例如,如果您有类似添加观察者的内容
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(filterready:)
name:@"filterReady"
object:nil];
现在我没有删除Observer的方法,但是每次显示视图时都会调用viewDidLoad,导致多个观察者在一段时间后运行,然后多次调用选择器。
我可以通过将一些清洁工移动到viewDidDisappear方法中来解决这个问题,但现在我有一些疑问,如果我做的是正确的事。
在我的示例中,我有多个控制其子导航的导航控制器,但是从未为它们调用dealloc,即使它们未被引用
答案 0 :(得分:106)
你应该使用
- (void)didReceiveMemoryWarning
和
- (void)dealloc
方法。
在iOS 6中,现在不推荐使用UIViewController的viewWillUnload和viewDidUnload方法。如果您使用这些方法来释放数据,请改用didReceiveMemoryWarning方法。如果未使用此方法,也可以使用此方法释放对视图控制器视图的引用。在执行此操作之前,您需要测试视图不在窗口中。
因此,您应首先检查您的视图是否在窗口中,然后在didReceiveMemoryWarning
答案 1 :(得分:14)
首先,即使viewDidUnload
未被弃用,您也必须在viewDidUnload
和dealloc
中取消注册该通知。即使在iOS 6之前,在大多数情况下都不会调用viewDidUnload
;仅在内存不足的情况下。因此,如果您之前只将它放在viewDidUnload
而不是dealloc
中,那么它就不会被取消注册,并且当它被取消分配并收到通知时可能会崩溃。因此,您必须先将其放入dealloc
,才能使其正常工作。
其次,如果你之前做得正确,你不需要做任何额外的事情就可以在iOS 6中正常工作.iOS 6中唯一的区别就是视图根本不再被卸载(即使在低内存中也是如此)的情况下)。因此,当您没有遇到内存不足的情况时,它与iOS 5中的相同。由于未卸载视图,因此viewDidLoad
只会调用一次,因此您的通知只会注册一次。它将在dealloc
中取消注册,因为您必须让它正常工作。
答案 2 :(得分:10)
答案 3 :(得分:4)
为什么不删除DEALLOC函数中的观察者? 如果您使用ARC,请不要调用[super dealloc]
如果你看到控制器dealloc函数没有被调用,那么你需要发现它为什么。也许你有一个在ViewController上运行的NSTimer,当你弹出视图时,这会导致dealloc不被调用。或者视图被保留在其他地方。