ios7 - iOS6 viewDidUnload已过时




ios5 (5)

也许这是一个不好的做法,但是从我阅读的文档中,我得到了在viewDidLoad方法中的某些情况下初始化对象的建议,并在viewDidUnload中将其设置为nil。

例如,如果您有类似添加观察者的内容

[[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(filterready:)
                                                 name:@"filterReady"
                                               object:nil];

现在我没有删除Observer的方法,但是每次显示视图时都会调用viewDidLoad,导致多个观察者在一段时间后运行,然后多次调用选择器。

我可以通过将一些清洁工移动到viewDidDisappear方法来解决这个问题,但现在我有一些疑问,如果我做的是正确的事情。

在我的示例中,我有多个控制其子导航的导航控制器,但是从不为它们调用dealloc,即使它们未被引用


Answers

首先,即使不推荐使用viewDidUnload ,您也必须在viewDidUnload AND dealloc取消注册该通知。 即使在iOS 6之前,在大多数情况下都不会调用viewDidUnload ; 仅在内存不足的情况下。 因此,如果您之前只将它放在viewDidUnload而不是dealloc ,那么它就不会被注销,并且当它被解除分配并收到通知时它可能会崩溃。 所以你必须把它放在dealloc之前,因为它已经正常工作。

其次,如果你之前做得正确,你不需要做任何额外的工作就可以在iOS 6中正常工作.iOS 6中唯一的区别就是视图根本不再被卸载(即使在低内存情况下)。 因此,当您没有遇到内存不足的情况时,它与iOS 5中的相同。 由于未卸载视图,因此只会调用一次viewDidLoad ,因此您的通知只会注册一次。 它将在dealloc中取消注册,因为你必须让它正常工作。


为什么不删除DEALLOC函数中的观察者? 如果您使用ARC,请不要调用[super dealloc]

如果你查看控制器dealloc函数没有被调用,那么你需要发现它为什么。 也许您在ViewController上运行了NSTimer,当您弹出视图时,这会导致dealloc无法被调用。 或者视图被保留在其他地方。


您应该使用- (void)didReceiveMemoryWarning- (void)dealloc方法。

在iOS 6中,现在不推荐使用UIViewController的viewWillUnload和viewDidUnload方法。 如果您使用这些方法来释放数据,请改用didReceiveMemoryWarning方法。 如果未使用此方法,也可以使用此方法释放对视图控制器视图的引用。 在执行此操作之前,您需要测试视图不在窗口中。

因此,您应首先检查您的视图是否在窗口中,然后在didReceiveMemoryWarning删除您的观察者


亚历克斯回答很好。 但我喜欢正确的配对。 出于这个原因,除非视图需要在看不见时通知,否则我通常会在viewWillAppear和viewDidDisappear上添加通知


我有这个问题,解决它只是一件简单的事情。

如果你已经创建了,请保留笔尖...

转到(XIB文件)并将对象库中的tableView组件添加到XIB文件的iPhone屏幕,它应该工作:)







ios6