dealloc和viewdidunload有什么区别?

5

我应该在程序中什么时候释放所有分配的内存?

因为我只有一个viewDidLoad方法来处理我的业务。我应该保持dealloc为空,在viewDidUnload中进行清理吗?

2个回答

8

'dealloc'用于在对象准备释放时使用(即当对象的保留计数变为0时)。而viewDidUnload是在视图卸载时调用的,但它可能不会立即被释放,因为UIViewController的引用仍然被其他对象存储。

我的个人偏好是,对于由'init'创建的对象,它们将由'dealloc'释放,对于由'viewDidLoad'创建的对象,它们将由'viewDidUnload'释放。


2
这并不是一种“喜好”,而是一种必要性。请记住,-viewDidLoad 可能会被调用多次,尽管总会有一个-viewDidUnload 调用在其中。然而,在 -dealloc 中创建的内容应该在 -viewDidLoad 中清除,因为在控制器被释放之前,-viewDidUnload 可能不会被调用。 - Johan Kool

4
正如-viewDidUnload的文档所述:
在低内存条件下,当视图控制器需要释放其视图和与该视图相关联的任何对象以释放内存时,将调用此方法。因为视图控制器经常存储对视图和其他与视图相关的对象的引用,所以您应该使用此方法来放弃对这些对象的所有权,以便可以回收它们的内存。您只应该针对那些可以在您的viewDidLoad方法或应用程序的其他部分中轻松重新创建的对象使用此方法。您不应该使用此方法来释放用户数据或任何无法轻松重新创建的信息。
通常,视图控制器使用outlet来存储对对象的引用,outlet是一个包含IBOutlet关键字并使用Interface Builder配置的变量或属性。视图控制器还可以以编程方式存储对其创建的对象的指针,例如在viewDidLoad方法中。放弃对任何对象(包括那些在outlet中的对象)的所有权的首选方法是使用相应的访问器方法将对象的值设置为nil。但是,如果您没有给定对象的访问器方法,则可能必须显式释放该对象。
文档中没有提到-viewDidUnload会在-dealloc中调用,您不应该依赖它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接