Iphone 我到底要做些什么?

Iphone 我到底要做些什么?,iphone,memory-management,Iphone,Memory Management,我倾向于在-dealoc中发布我的东西,现在iPhone OS 3.0引入了这个有趣的-viewDidUnload方法,他们说: //释放的所有保留子视图 主视图e、 g.自我输出 =零 当视图控制器的视图已从内存中启动时,似乎会调用So-viewDidUnload。如果我有附加到视图控制器主视图的子视图,我必须只在这里发布这些内容,而不是在dealloc中发布 那太令人困惑了。另外,如果-dealloc导致视图被卸载(释放),该怎么办?然后再次调用-viewDidUnload 我确实意识到了区

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

//释放的所有保留子视图 主视图e、 g.自我输出 =零

当视图控制器的视图已从内存中启动时,似乎会调用So-viewDidUnload。如果我有附加到视图控制器主视图的子视图,我必须只在这里发布这些内容,而不是在dealloc中发布

那太令人困惑了。另外,如果-dealloc导致视图被卸载(释放),该怎么办?然后再次调用-viewDidUnload

我确实意识到了区别,即-viewDidUnload只适用于视图本身被终止,但视图控制器保留在内存中的情况。而且-dealloc适用于所有东西都变成垃圾的情况

也许有人可以澄清这一困惑。

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

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

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

以下引用自苹果的内存管理部分,对其进行了更详细的描述:

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

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


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

当收到内存警告时,通常viewcontroller将卸载其视图,但其本身不会解除锁定。

所有可以轻松重新创建的内容都应该卸载,但不能卸载视图的模型。

类似的问题:iOS 6中不推荐使用viewDidUnload!viewDidUnload不是viewDidLoad的镜像,因为Unload方法将outlets设置为nil。您指的是哪种Unload方法?我浏览了UIViewController文档,但没有找到具有该名称的方法。当我将viewDidUnload描述为(通常)viewDidLoad的镜像时,我指的是内存管理;i、 e:在viewDidLoad中分配、复制或保留的任何内容都应在viewDidUnload中释放。IBOutlets通常在加载nib文件时自动配置,因此即使在调用viewDidUnload之前将其设置为nil,从内存的角度来看,这也不会影响任何内容;我可以看出,如果在viewDidLoad中分配一个对象,当所有IBOutlets都设置为nil时,该对象在viewDidUnload中变得不可访问,那么可能会遇到麻烦。然而,这强烈表明设计不好,因为对象应该始终保持指向它负责释放的任何内存的指针。