在 viewDidUnload 中我到底必须做啥?

Posted

技术标签:

【中文标题】在 viewDidUnload 中我到底必须做啥?【英文标题】:What exactly must I do in viewDidUnload?在 viewDidUnload 中我到底必须做什么? 【发布时间】:2011-01-16 17:54:25 【问题描述】:

我倾向于在 -dealloc 中发布我的东西,现在 iPhone OS 3.0 引入了这个有趣的 -viewDidUnload 方法,他们说:

// 释放所有保留的子视图 主视图。 // 例如self.myOutlet = 无;

因此,当视图控制器的视图从内存中启动时,似乎会调用 -viewDidUnload。如果我将子视图附加到视图控制器的主视图,我必须只在此处发布这些东西,而不是在 -dealloc 中?

这令人困惑。另外,如果 -dealloc 导致视图被卸载(释放)怎么办?话又说回来,它会调用-viewDidUnload?

我确实意识到不同之处,即 -viewDidUnload 仅适用于视图本身被杀死但视图控制器保留在内存中的情况。而 -dealloc 则适用于整个事情都被丢弃的情况。

也许有人可以解决这个困惑。

【问题讨论】:

类似问题:***.com/questions/1158788/… viewDidUnload 在 ios 6 中已弃用! 【参考方案1】:

这里的目的是“平衡”您的子视图管理。您在viewDidLoad 中创建的任何内容都应在viewDidUnload 中发布。这使得更容易跟踪应该在哪里发布的内容。在大多数情况下,您的dealloc 方法是您的init 方法的镜像,您的viewDidUnload 将是您的viewDidLoad 方法的镜像。

正如您所指出的,在加载和卸载视图本身时将使用 viewDid... 方法。这允许视图控制器保持加载在内存中的使用模式,但视图本身可以根据需要加载和卸载:

init
viewDidLoad
viewDidUnload
viewDidLoad
viewDidUnload
...
dealloc

当然,在dealloc 方法中释放东西也没有什么坏处,只要在viewDidUnload 释放它们时将它们设置为nil

以下引自 Apple 的 UIViewController documentation 内存管理部分的引述更详细地描述了它:

...在 iPhone OS 3.0 及更高版本中,viewDidUnload 方法可能更适合大多数需求。

当发生内存不足警告时,如果 UIViewController 类知道以后可以重新加载或重新创建视图,则它会清除其视图。如果发生这种情况,它还会调用 viewDidUnload 方法,让您的代码有机会放弃与视图层次结构关联的任何对象的所有权,包括使用 nib 文件加载的对象、在 viewDidLoad 方法中创建的对象以及在运行时并添加到视图层次结构中。通常,如果您的视图控制器包含 outlet(包含 IBOutlet 关键字的属性或原始变量),您应该使用 viewDidUnload 方法放弃对这些 outlet 或您不再需要的任何其他视图相关数据的所有权。

【讨论】:

viewDidUnload 不是 viewDidLoad 的镜像,因为 Unload 方法将 outlet 设置为 nil。 您指的是哪种卸载方法?我浏览了 UIViewController 文档,但没有找到具有该名称的方法。当我将 viewDidUnload 描述为(通常)是 viewDidLoad 的镜像时,我指的是内存管理;即:在 viewDidLoad 中分配、复制或保留的任何内容都应在 viewDidUnload 中释放。 IBOutlets 通常在加载 nib 文件时自动配置,因此即使在调用 viewDidUnload 之前将它们设置为 nil,从内存的角度来看,这不会影响任何内容。 要清楚;如果您要在 viewDidLoad 中分配一个对象,当所有 IBOutlets 都设置为 nil 时,该对象将在 viewDidUnload 中变得不可访问,我可以看到它是如何可能遇到麻烦的。然而,这将是一个糟糕设计的强烈迹象,因为一个对象应该始终保持一个指向它负责释放的任何内存的指针。【参考方案2】:

正如您所说,如果 self.view=nil 将调用 viewDidUnload,这通常会在您收到内存警告时发生。在此方法中,您必须释放主视图的任何子视图,这些子视图可以通过 .xib 或 loadView 方法轻松创建。如果您在 viewDidload 或 loadView 等中创建数据对象,您应该释放它们。因为这些方法将被再次调用以向用户呈现视图,这些数据可以很容易地重新创建。

【讨论】:

【参考方案3】:

当您收到内存警告时,通常视图控制器会卸载它的视图,但它本身不会被释放。 所有可以轻松重新创建的都应该被卸载,而不是视图的模型。

【讨论】:

以上是关于在 viewDidUnload 中我到底必须做啥?的主要内容,如果未能解决你的问题,请参考以下文章

">"在Css中做啥[重复]

file.flush() 到底在做啥?

Nullify 删除规则到底在做啥?

Three.js raycaster 到底在做啥?

-fno-builtin 到底在做啥?

Python 多处理模块的 .join() 方法到底在做啥?