从 iOS 6.0 开始,不推荐使用 viewDidUnload 方法。在 iOS 6 之前,我曾经在 viewDidUnload 方法中删除 NSNotification 的Observer。但由于它已弃用,我已将其移至 didReceiveMemoryWarning。现在,如果我的应用收到低内存警告,通知将被删除。所以我用 NSNotification 编写的代码不起作用。
谁能告诉我如何解决这个问题?
提前致谢。
从 iOS 6.0 开始,不推荐使用 viewDidUnload 方法。在 iOS 6 之前,我曾经在 viewDidUnload 方法中删除 NSNotification 的Observer。但由于它已弃用,我已将其移至 didReceiveMemoryWarning。现在,如果我的应用收到低内存警告,通知将被删除。所以我用 NSNotification 编写的代码不起作用。
谁能告诉我如何解决这个问题?
提前致谢。
我假设您在viewDidLoad
. 问题是,即使在内存不足的情况下,iOS 6 上的视图也不会被卸载。因此,如果您删除了 中的观察者didReceiveMemoryWarning
,viewDidLoad
将不会再次被调用。
您可以选择两种相对简单的替代方案:
viewWillAppear
并将其删除viewWillDisappear
。initXXX
在您的方法中添加观察者并在dealloc
.我可以在中添加观察者viewDidLoad
并将其删除didReceiveMemoryWarning
。但是你必须“手动卸载”中的视图didReceiveMemoryWarning
,以便viewDidLoad
稍后再次调用。有关如何强制卸载视图的示例代码,请参见例如https://stackoverflow.com/a/15805715/1187415 。
问题是你完全误解了这viewDidUnload
意味着什么。卸载viewDidUnload
视图时调用。在 iOS 6 之前的版本中,当您使用完视图控制器后,它的视图不会被卸载。在 iOS 6 之前的版本中,99% 的时间你永远不会看到正在运行,因为视图通常不会被卸载。在 iOS 6 之前的版本中,仅在响应内存警告时才会卸载视图,并且视图不可见。在 iOS 6 中,唯一的变化是视图永远不会被卸载,即使在内存警告中也是如此。viewDidUnload
的行为viewDidUnload
在 iOS 6 之前的版本和 iOS 6 中是相同的——它在视图被卸载时被调用。因此,您不必更改 iOS 6 的任何代码。如果这样做,则说明您做错了。
在 iOS 6 之前,我曾经在 viewDidUnload 方法中删除 NSNotification 的Observer。
如果您的意思是在 中添加了观察者viewDidLoad
,那么您必须在 中将其删除dealloc
。否则你的代码会崩溃。正如我上面所说,99% 的时间,在 iOS 6 之前的版本中,视图不会被卸载。典型的流程是init
-> viewDidLoad
-> dealloc
。视图不会在中间卸载。
您还可以选择删除 中的观察者viewDidUnload
。这是一个好主意,因为它将视图返回到加载视图之前的状态。然而,这并不是绝对必要的,因为当视图再次加载时,viewDidLoad
将被调用,并覆盖之前的任何状态。
所以答案是,你不应该为了响应 iOS 6 而改变任何东西。你所做的任何事情都应该在(可选)和(必需)viewDidLoad
中都被撤销。在 iOS 6 和 iOS 6 之前的版本中都是如此。viewDidUnload
dealloc