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