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