0

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

有人可以告诉我我该如何解决这个问题?

在此先感谢。

回答

4

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

有两个相对简单的选择,你可以选择:

  • 添加观察员viewWillAppearviewWillDisappear删除它。
  • 在您的initXXX方法中添加观察者,并在dealloc中将其删除。

可能添加观察员viewDidLoaddidReceiveMemoryWarning删除它。但是,您必须“手动卸载”didReceiveMemoryWarning中的视图,以便稍后再调用viewDidLoad。见例如示例代码https://stackoverflow.com/a/15805715/1187415如何强制卸载视图。

+0

感谢您的回复。我可以按照第一个替代方案,因为我需要通知,而应用程序正在运行。我可以在viewDidLoad中添加观察者并在dealloc方法中将其删除?谢谢 – iOSAppDev 2013-04-20 10:12:32

+0

@iOSAppDev:是的,但是你必须设置一个标志,不管观察者是否被添加,因为1)dealloc可能在调用之前没有调用viewDidLoad,2)如果你以后重写你的代码强制卸载视图,viewDidLoad会再次被调用。但addObserver/removeObserver调用的数量必须完全匹配。 – 2013-04-20 10:16:55

+0

我从你的评论中了解到的是我需要添加一个标志让我们说isObserverRemovedForNotification。我将在dealloc中设置它。因此,在viewDidLoad中,我将检查 'if(isObserverRemovedForNotification){ // Add observer for notification }' 它是正确的吗? 也可以用ARC写dealloc方法吗? – iOSAppDev 2013-04-20 12:21:07

0

问题是你完全误解了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%的时间没有被卸载。典型的流程是initviewDidLoaddealloc。该视图不会在中间卸载。

您也可以选择删除viewDidUnload中的观察者。这是一个好主意,因为它会将其返回到视图加载前的状态。然而,这并不是绝对必要的,因为当视图再次载入时,viewDidLoad将被调用,并且无论如何覆盖以前的任何状态。

因此,答案是,你不应该有响应改变任何东西到iOS 6,不管你在做viewDidLoad应该在这两个viewDidUnload(可选)和dealloc(需要)被撤销。这在iOS 6和iOS 6之前都是如此。

+0

感谢您的回复。根据你的答案,我可以在viewDidLoad中添加观察者并在dealloc方法中将其删除,对吧?我可以使用ARC编写dealloc方法吗? – iOSAppDev 2013-04-20 11:09:39

+0

@iOSAppDev:当然 – newacct 2013-04-20 18:51:22

+0

感谢您的回复。 – iOSAppDev 2013-04-21 13:03:34