2011-06-08 40 views
0

我所做的所有教程都说,我将所有的东西都设置为无,在viewDidUnload中,然后在dealloc中释放。不过,我被告知,这将导致内存泄漏,因为viewDidUnload在dealloc之前被调用,所以我无法释放任何设置为零的内容。为什么我会看到一些代码在viewDidUnload中发布的东西,而不是dealloc?

有人可以澄清?

+0

可能的重复[什么时候应该释放对象在 - (void)viewDidUnload而不是在-dealloc中?](http://stackoverflow.com/questions/1158788/when-should-i-release-objects- in-voidviewdidunload-rather-in-dealloc) – PengOne 2011-06-08 04:31:49

回答

4

如果你创建一个对象(allocinit)在viewDidLoad,那么你应该在viewDidUnloadrelease它。原因是有时调用viewDidUnload来节省内存,但不调用dealloc。然后,以后可能再次调用viewDidLoad。一般而言,以反向方法释放你分配的任何东西,例如

如果您分配init中的对象,然后将其释放到dealloc

如果您在viewDidLoad中分配了一个对象,然后在viewDidUnload中释放它。

如果分配在viewWillAppear(或viewDidAppear)的对象,然后在viewWillDisappear(或viewDidDisppear)释放它。

+0

+1,Bang on ....很好的回答.. – visakh7 2011-06-08 04:31:44

+0

iboutlets或者属性怎么样?任何特殊规则? – jini 2011-06-08 04:44:24

0

看看@Sean在此前的SO question给出的答案。他明确指出释放的viewDidUnload

其中一个最重要的原因的宗旨,为实现 它是 的UIViewController子类通常 也包含在视图 层次拥有以 各种子视图引用。这些属性可能有 通过IBOutlets设置,当从一个笔尖加载 或 以编程方式在-loadView内部时,对于 实例。

通过的UIViewController子视图 的附加所有权意味着 即使当它的视图被从 视图层次结构中移除并释放到保存 存储器,通过其子视图 也由视图释放时,它们将 不实际上被释放,因为 UIViewController本身仍然包含它自己的优秀保留 对这些对象的引用。 释放UIViewController的 这些对象的附加所有权 确保它们将被释放为 以释放内存。

,你在这里释放的对象是 通常重建,并重新设置时 的UIViewController的观点是 重新加载,无论是从笔尖或 通过 -loadView的实现。

另请注意,在调用此 方法时,UIViewController的 视图属性为零。

相关问题