don*_*ile 20 iphone memory-management
我倾向于在-dealloc中释放我的东西,现在iPhone OS 3.0引入了这个有趣的-viewDidUnload方法,他们说:
//释放主视图的所有保留子视图.//例如self.myOutlet = nil;
因此,当视图控制器的视图从内存中启动时,-viewDidUnload似乎被调用.如果我有附加到视图控制器主视图的子视图,我必须只在这里发布那些东西,但不是在-dealloc中也是如此?
这令人困惑.另外,如果-dealloc导致视图被卸载(释放),该怎么办?然后,它会调用-viewDidUnload?
我确实意识到差异,-viewDidUnload仅适用于视图本身被杀死但视图控制器保留在内存中的情况.并且-dealloc适用于整个事情进入垃圾箱的情况.
也许有人可以解决困惑.
e.J*_*mes 37
这里的目的是"平衡"您的子视图管理.您创建的任何内容viewDidLoad
都应该发布viewDidUnload
.这样可以更容易地跟踪应该在哪里发布的内容.在大多数情况下,您的dealloc
方法是方法的镜像init
,您viewDidUnload
将成为方法的镜像viewDidLoad
.
正如您所指出的,在viewDid
加载和卸载视图本身时将使用...方法.这允许视图控制器保持加载到内存中的使用模式,但视图本身可以根据需要加载和卸载:
init
viewDidLoad
viewDidUnload
viewDidLoad
viewDidUnload
...
dealloc
Run Code Online (Sandbox Code Playgroud)
当然,dealloc
只要你将它们设置为nil
释放它们时,在你的方法中释放东西也没有什么坏处viewDidUnload
.
以下来自Apple UIViewController
文档的内存管理部分的引用更详细地描述了它:
...在iPhone OS 3.0及更高版本中,viewDidUnload方法可能是更适合大多数需求的地方.
发生低内存警告时,如果UIViewController类知道它可以重新加载或稍后再次重新创建它们,则会清除它的视图.如果发生这种情况,它还会调用viewDidUnload方法,让您的代码有机会放弃与视图层次结构相关联的任何对象的所有权,包括使用nib文件加载的对象,viewDidLoad方法中创建的对象以及懒惰创建的对象.运行时并添加到视图层次结构中.通常,如果视图控制器包含出口(属性或包含IBOutlet关键字的原始变量),则应使用viewDidUnload方法放弃这些出口的所有权或您不再需要的任何其他视图相关数据.