iOS6 viewDidUnload已过时
也许这是一个不好的做法,但从我阅读的文档中,我得到了在viewDidLoad方法内初始化对象的build议,而在viewDidUnload中它是零。
例如,如果你有像添加一个观察者的东西
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(filterready:) name:@"filterReady" object:nil];
现在我没有方法来移除Observer,但是每次显示视图时都会调用viewDidLoad,导致多个观察者在一段时间后运行,然后多次调用select器。
我可以通过将一些清洁剂移动到viewDidDisappear方法来解决这个问题,但是现在我有些怀疑我是否做了正确的事情。
在我的示例中,我有多个控制其子导航的导航控制器,但是从未调用过dealloc,即使它们没有被引用
你应该使用- (void)didReceiveMemoryWarning
和- (void)dealloc
方法。
在iOS 6中,UIViewController的viewWillUnload和viewDidUnload方法现在已被弃用。 如果您正在使用这些方法来释放数据,请改为使用didReceiveMemoryWarning方法。 如果不使用视图控制器视图,也可以使用此方法释放对视图控制器视图的引用。 在执行此操作之前,您需要testing视图不在窗口中。
所以你应该先检查你的视图是否在窗口中,然后在didReceiveMemoryWarning
移除你的观察者
首先,即使viewDidUnload
不被弃用,你也必须在viewDidUnload
和dealloc
取消注册该通知。 即使在iOS 6之前,在大多数情况下都不会调用viewDidUnload
。 只在低内存的情况下。 所以,如果你只把它放在viewDidUnload
而不是dealloc
之前,它不会被注销,并且在它被释放并收到通知时它可能会崩溃。 所以你必须先把它放在dealloc
,才能正常工作。
其次,如果你以前做的是正确的,那么在iOS 6中不需要做任何额外的工作就可以正常工作。iOS 6唯一的区别是视图不再被卸载(即使在内存不足的情况下)。 所以当你没有遇到内存不足的情况时,它与iOS 5中的一样。 由于视图不被卸载, viewDidLoad
只会被调用一次,所以你的通知只能被注册一次。 它将在dealloc
中注销,因为你必须把它放在正确的位置。
Alex答案很好。 但我喜欢适当的配对。 出于这个原因,除非视图需要被通知,甚至没有看到,我通常添加通知在viewWillAppear和viewDidDisappear
为什么不只是删除DEALLOC函数中的观察者呢? 如果你使用ARC,不要调用[super dealloc]
如果你查看controller dealloc函数没有被调用,那么你需要发现这是为什么。 也许你有一个NSTimer在ViewController上运行,当你popup视图时,这会导致dealloc不被调用。 或者视图被保留在其他地方。
- 如何在iOS 6中设置UIActivityViewController的收件人?
- iOS自动化与UIScrollview:为什么滚动视图的内容视图不能填充滚动视图?
- 我可以通过UIAppearance代理设置哪些属性?
- iOS 6中的自动旋转具有奇怪的行为
- 无法使用Mac键盘在iphone模拟器中input文本框?
- iOS 6:如何限制一些视图的肖像,并允许他人旋转?
- 在Xcode 6中运行iOS 6 Simulator中的应用程序
- MFMailComposeViewController抛出一个viewServiceDidTerminateWithError,然后在使用自定义标题字体时退出
- AppDelegate,rootViewController和presentViewController