在 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 中我到底必须做啥?的主要内容,如果未能解决你的问题,请参考以下文章