【问题标题】:viewDidUnload called after dealloc?在dealloc之后调用viewDidUnload?
【发布时间】:2011-02-18 08:52:17
【问题描述】:

当我调试我的 iPad 应用程序时,我发现由于内存不足,一些视图控制器的 viewDidUnload 被调用。但几秒钟后,他们的viewDidLoad 被调用。然后又因为内存不足,viewDidUnload,然后又是viewDidLoad。这就像文件系统由于内存不足而不断交换文件。

应该是这样,还是我做错了什么?

然后我想释放视图控制器来摆脱这个。但有时viewDidUnloaddealloc 之前被调用,然后由于选择器发送到释放的视图控制器而崩溃。

感谢您的帮助。

【问题讨论】:

  • er,我刚刚在发布此问题后的第一部分得到它。我使用控制器的视图属性作为 [view removeFromSuperview] 如果它不在内存中加载视图。使用 [controller isViewLoaded] 即可解决。
  • 我阅读了文档,我注意到视图属性的访问会导致视图被加载,但是。我希望医生尽可能地强调这一点,哈哈

标签: ios uiviewcontroller didreceivememorywarning viewdidunload


【解决方案1】:

这是完全正常的行为。 viewDidUnload 在内存不足的情况下被调用,以通知您的控制器该视图已被释放。

View Controller Programming Guide for iOS 中有清晰的步骤大纲。

特别是查看Understanding How Views Are Loaded and Unloaded 部分中详细介绍的步骤,其中涵盖了卸载周期:

  1. 应用收到来自系统的内存不足警告。

  2. 每个视图控制器都会调用其 didReceiveMemoryWarning 方法。如果您覆盖此方法,您应该使用它来释放任何内存或 您的视图控制器对象不再需要的对象。不使用 它释放你的视图控制器的视图。你必须在某些时候打电话给 super 在您的实现中指向以确保默认实现 运行。默认实现尝试释放视图。

  3. 如果无法安全释放视图(例如,它在屏幕上可见),则返回默认实现。

  4. 视图控制器调用其 viewWillUnload 方法来通知子类视图即将被删除。一个子类 通常在需要保存时覆盖 viewWillUnload 方法 视图被销毁之前的任何视图属性。

等等。

在您的具体情况下,您绝对希望在这种情况下释放视图控制器。如果您想在内存不足的情况下进行任何进一步的内存管理,您应该覆盖didReceiveMemoryWarning 的默认实现。正如文档所述,不要忘记致电[super didReceiveMemoryWarning];

【讨论】:

  • 旁注 viewDidUnload 自 iOS 6 起已弃用。
猜你喜欢
  • 1970-01-01
  • 2012-09-07
  • 2011-07-01
  • 2011-01-22
  • 2012-04-10
  • 2012-06-25
  • 2010-12-18
  • 2011-09-20
  • 2011-02-20
相关资源
最近更新 更多