那么什么是ARC的交易以及在viewDidUnload上发布属性/子视图

bod*_*ous 1 objective-c-2.0 ios automatic-ref-counting xcode4.3

我还在学习iOS开发,并且一直在使用各种教程和书籍.有些预ARC,有些有ARC.

在某些情况下,我们被教导在viewDidUnload上释放ViewController的所有属性和子视图,但在某些情况下我被告知不再需要它.

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

-(void)viewDidUnload
{
  [super viewDidUnload];
  self.photoViewCell = nil;
  self.photoImageView = nil;
  self.firstNameTextField = nil;
  self.lastNameTextField = nil;
}
Run Code Online (Sandbox Code Playgroud)

... 或不?如果是这样,这仅适用于作为UIView后代的属性,还是适用于ViewController的所有属性?

谢谢

Chr*_*ian 8

所以每个视图都有很多所有者.当"所有者计数"(通常称为retainCount)达到0时,该对象将被销毁.

在iOS 5中,我们现在有弱引用,这实际上意味着"不拥有此对象".

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

IBOutlet UILabel *myLabel;
Run Code Online (Sandbox Code Playgroud)

此标签已添加到XIB文件的视图中.myLabel有2名业主在这种情况下:这是上海华(在XIB文件中的视图)和视图控制器(由具有IBOutlet中).当调用viewDidUnload时,视图控制器的视图已被释放,因此它对myLabel的所有权已经消失.所以myLabel此时只有1个所有者,即视图控制器.因此我们需要在viewDidLoad中释放它以确保它没有任何所有者,因此被销毁.

使用iOS 5,您会经常看到它

__weak IBOutlet UILabel *myLabel
Run Code Online (Sandbox Code Playgroud)

这就是说我们不希望视图控制器成为myLabel的所有者.所以唯一的所有者是视图控制器的视图.因此,当viewDidUnload得到的调用,视图控制器的观点已被释放,并因此其myLabel的所有权也得到了释放.在这种情况下,myLabel现在没有所有者,它的内存被释放.self.myLabel = nil; 那里.

因此,对于iOS 5,建议将所有IBOutlet作为弱引用.有了这个,您甚至不需要实现viewDidUnload,因为已经为您处理了所有内存.

但即使您使用的是iOS 5,如果您的IBOutlet不是弱引用,您也需要在viewDidUnload中使用该代码.