当我调试我的 iPad 应用程序时,我发现由于内存不足,一些视图控制器viewDidUnload
被调用了。但几秒钟后,他们viewDidLoad
被召唤了。然后又是因为内存不足viewDidUnload
,然后viewDidLoad
又是。这就像文件系统由于内存不足而不断交换文件。
应该是这样,还是我做错了什么?
然后我想释放视图控制器来摆脱这个。但有时会viewDidUnload
在之前调用dealloc
,然后由于选择器发送到释放的视图控制器而崩溃。
感谢您的任何帮助。
当我调试我的 iPad 应用程序时,我发现由于内存不足,一些视图控制器viewDidUnload
被调用了。但几秒钟后,他们viewDidLoad
被召唤了。然后又是因为内存不足viewDidUnload
,然后viewDidLoad
又是。这就像文件系统由于内存不足而不断交换文件。
应该是这样,还是我做错了什么?
然后我想释放视图控制器来摆脱这个。但有时会viewDidUnload
在之前调用dealloc
,然后由于选择器发送到释放的视图控制器而崩溃。
感谢您的任何帮助。
这是完全正常的行为。viewDidUnload
在内存不足的情况下调用以通知您的控制器该视图已被释放。
View Controller Programming Guide for iOS中有一个清晰的步骤大纲。
特别是,查看“了解视图如何加载和卸载”部分中详细介绍的步骤,其中涵盖了卸载周期:
该应用程序收到来自系统的内存不足警告。
每个视图控制器都会调用它的 didReceiveMemoryWarning 方法。如果您覆盖此方法,您应该使用它来释放视图控制器对象不再需要的任何内存或对象。不要使用它来释放视图控制器的视图。您必须在实现中的某个时刻调用 super 以确保默认实现运行。默认实现尝试释放视图。
如果无法安全释放视图(例如,它在屏幕上可见),则返回默认实现。
视图控制器调用它的 viewWillUnload 方法来通知子类视图即将被删除。当需要在视图被销毁之前保存任何视图属性时,子类通常会覆盖 viewWillUnload 方法。
等等。
在您的特定情况下,您绝对不想在这种情况下释放视图控制器。如果您想在内存不足的情况下进行任何进一步的内存管理,则应覆盖didReceiveMemoryWarning的默认实现。正如文档所述,不要忘记调用[super didReceiveMemoryWarning];
.