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的所有属性?
谢谢
所以每个视图都有很多所有者.当"所有者计数"(通常称为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中使用该代码.
| 归档时间: |
|
| 查看次数: |
2194 次 |
| 最近记录: |