问题是你完全误解了viewDidUnload
的含义。当视图是卸载时调用viewDidUnload
。在iOS 6之前的版本中,当您完成视图控制器时,其视图不会被卸载。在iOS 6之前的版本中,有99%的时间永远不会看到viewDidUnload
正在运行,因为视图通常不会被卸载。在iOS 6之前,视图仅在响应内存警告时被卸载,并且视图不可见。在iOS 6中,唯一的变化是即使在内存警告中也不会卸载视图。
viewDidUnload
的行为在iOS 6和iOS 6之前是相同的 - 当视图被卸载时它会被调用。因此,您不必更改iOS 6的任何代码。如果这样做,您做错了什么。
在iOS 6之前我用viewDidUnload方法去除了NSNotification的Observer。
如果你的意思是,你在viewDidLoad
添加的观察者,那么你必须有它dealloc
删除。否则你的代码会崩溃。正如我上面所说的,在iOS 6以前的版本中,有99%的时间没有被卸载。典型的流程是init
→viewDidLoad
→dealloc
。该视图不会在中间卸载。
您也可以选择删除viewDidUnload
中的观察者。这是一个好主意,因为它会将其返回到视图加载前的状态。然而,这并不是绝对必要的,因为当视图再次载入时,viewDidLoad
将被调用,并且无论如何覆盖以前的任何状态。
因此,答案是,你不应该有响应改变任何东西到iOS 6,不管你在做viewDidLoad
应该在这两个viewDidUnload
(可选)和dealloc
(需要)被撤销。这在iOS 6和iOS 6之前都是如此。
感谢您的回复。我可以按照第一个替代方案,因为我需要通知,而应用程序正在运行。我可以在viewDidLoad中添加观察者并在dealloc方法中将其删除?谢谢 – iOSAppDev 2013-04-20 10:12:32
@iOSAppDev:是的,但是你必须设置一个标志,不管观察者是否被添加,因为1)dealloc可能在调用之前没有调用viewDidLoad,2)如果你以后重写你的代码强制卸载视图,viewDidLoad会再次被调用。但addObserver/removeObserver调用的数量必须完全匹配。 – 2013-04-20 10:16:55
我从你的评论中了解到的是我需要添加一个标志让我们说isObserverRemovedForNotification。我将在dealloc中设置它。因此,在viewDidLoad中,我将检查 'if(isObserverRemovedForNotification){ // Add observer for notification }' 它是正确的吗? 也可以用ARC写dealloc方法吗? – iOSAppDev 2013-04-20 12:21:07