我设置了一个详细视图,我是否有几个 Nib 文件会根据在根视图控制器表中选择的项目而被加载。
我发现对于 Nibs 的类,viewDidUnload
从不调用,而viewWillDisappear
调用当然也调用了 dealloc。
有人知道为什么会这样吗?
谢谢。
我设置了一个详细视图,我是否有几个 Nib 文件会根据在根视图控制器表中选择的项目而被加载。
我发现对于 Nibs 的类,viewDidUnload
从不调用,而viewWillDisappear
调用当然也调用了 dealloc。
有人知道为什么会这样吗?
谢谢。
我相信viewDidUnload
当视图从视图中消失时通常不会调用它。这样做的原因是因为dealloc
通常会处理所有的内存转储,所以它不需要先调用viewDidUnload
。
我认为一个示例将有助于确定何时viewDidUnload
调用。假设你有一个UINavigationController
并且你已经推动了一个新的观点。这个新视图在内存使用方面非常繁重,因此该应用程序试图支持一些资源。它通过查看是否加载了当前不在屏幕上的任何视图来执行此操作。如果是这样,它会调用viewDidUnload
理想情况下您删除在 loadView 或viewDidLoad
. 然后,当您返回该视图时,它会调用 loadView 或viewDidLoad
再次重新构建它在viewDidUnload
.
但是如果它不需要释放内存来显示你的细节视图,它就不会在它的正常处理中调用它。这就是为什么viewWillDisappear
被称为 (and dealloc
) 但从不被调用的原因viewDidUnload
。
来自 Apple 的文档:
当发生内存不足警告时,如果 UIViewController 类知道以后可以重新加载或重新创建它们,则它会清除其视图。如果发生这种情况,它还会调用 viewDidUnload 方法,让您的代码有机会放弃与视图层次结构关联的任何对象的所有权,包括使用 nib 文件加载的对象、在 viewDidLoad 方法中创建的对象以及在运行时并添加到视图层次结构中。通常,如果您的视图控制器包含出口(包含 IBOutlet 关键字的属性或原始变量),您应该使用 viewDidUnload 方法放弃这些出口或您不再需要的任何其他与视图相关的数据的所有权。