0

从 iOS 6.0 开始,不推荐使用 viewDidUnload 方法。在 iOS 6 之前,我曾经在 viewDidUnload 方法中删除 NSNotification 的Observer。但由于它已弃用,我已将其移至 didReceiveMemoryWarning。现在,如果我的应用收到低内存警告,通知将被删除。所以我用 NSNotification 编写的代码不起作用。

谁能告诉我如何解决这个问题?

提前致谢。

4

2 回答 2

4

我假设您在viewDidLoad. 问题是,即使在内存不足的情况下,iOS 6 上的视图也不会被卸载。因此,如果您删除了 中的观察者didReceiveMemoryWarningviewDidLoad将不会再次被调用。

您可以选择两种相对简单的替代方案:

  • 在 中添加观察者viewWillAppear并将其删除viewWillDisappear
  • initXXX在您的方法中添加观察者并在dealloc.

可以在中添加观察者viewDidLoad并将其删除didReceiveMemoryWarning。但是你必须“手动卸载”中的视图didReceiveMemoryWarning,以便viewDidLoad稍后再次调用。有关如何强制卸载视图的示例代码,请参见例如https://stackoverflow.com/a/15805715/1187415 。

于 2013-04-20T09:22:23.057 回答
0

问题是你完全误解了这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 之前的版本中都是如此。viewDidUnloaddealloc

于 2013-04-20T10:33:53.890 回答