那么ARC和在viewDidUnload上发布属性/子视图有什么关系?

我仍然在学习iOS开发,并且一直在处理各种教程和书籍。 一些预ARC,一些ARC。

在某些情况下,我们被教会在viewDidUnload上释放一个ViewController的所有属性和子视图,但在某些情况下,我被告知这不再是必需的。

有人可以给出明确的答案吗? 在iOS 5+中,是否需要完成整个操作?

-(void)viewDidUnload { [super viewDidUnload]; self.photoViewCell = nil; self.photoImageView = nil; self.firstNameTextField = nil; self.lastNameTextField = nil; } 

… 或不? 如果是这样,这只是为UIView的后代的属性,或者是为ViewController的所有属性?

谢谢

所以每个观点都有一些业主。 当“所有者数”(通常被称为retainCount)达到0时,该对象被破坏。

在iOS 5中,我们现在有弱引用,这实质上意味着“不拥有这个对象”。

在iOS 5之前,在我们的头文件中,你会看到

 IBOutlet UILabel *myLabel; 

这个标签被添加到XIB文件的视图。 在这种情况下,myLabel有两个所有者:它是superview(XIB文件中的视图)和视图控制器(通过具有IBOutlet)。 当viewDidUnload被调用时,视图控制器的视图已经被释放,因此myLabel的所有权就消失了。 所以myLabel在这一点上只有1个所有者,即视图控制器。 所以我们需要在viewDidLoad中释放它,以确保它没有任何所有者,因此被销毁。

在iOS 5中,您经常会看到这个

 __weak IBOutlet UILabel *myLabel 

这是说我们不希望视图控制器是myLabel的所有者。 所以唯一的所有者是视图控制器的视图。 所以当viewDidUnload被调用的时候,视图控制器的视图已经被释放了,所以myLabel的所有权也被释放了。 在这种情况下,myLabel现在没有所有者,它的内存被释放。 不需要self.myLabel = nil; 那里。

所以对于iOS 5,推荐使所有IBOutlet成为一个弱引用。 有了这个,你甚至不需要实现viewDidUnload,因为所有的内存都已经被照顾好了。

但即使你使用iOS 5,如果你的IBOutlets不是弱引用,你需要在viewDidUnload中的代码。

viewDidUnload与保留计数无关,自动或其他。 当视图由于内存压力而被卸载的时候,这个方法会被调用,这意味着你也应该把你强有力的引用视为零(和释放,非ARC)的视图元素。 不这样做可能意味着你的应用程序在内存压力下没有释放足够的内存,这可能导致它被操作系统closures。

你可以使用viewDidUnload来pipe理内存,如果你的App值得的话。

但是不要做

 myInstanceVariable = nil; 

你放松你的内存位置,你的variables的值居住的地方。

=零不释放内存。 不过,你的对象必须被释放。 因此使用retainCount和retain / release。

如果你在viewDidUnload中删除你的对象,你不能释放dealloc! 注意!!!

如果你知道,你做了什么,你可以在viewDidUnload中释放并删除你的对象。

弧:

使用ARC,你不能手动释放,即使我认为你不能这样做。 ARC负责照顾。 只要使用(弱/强)属性就可以尽可能多地使用@properties来让getter和setter为你完成工作。 你可以在你的.m文件中声明@properties(就像在类扩展中一样)。

简单的规则:对于你想拥有的对象来说很强大,对象很弱,你不想在保留周期中迷失方向并拥有所有权。 ARC几乎在所有情况下都做了其余的事情。 例如,使用弱代表。

零的对象,你肯定的地方,你不会给他们发送消息,否则不。