Pie*_*ero 32 weak-references ios ios5 automatic-ref-counting strong-references
我已将项目切换到ARC,我不明白是否必须使用strong或weak用于IBOutlets.Xcode执行此操作:在界面构建器中,如果创建一个UILabel例如我将它与助理编辑器连接到我的ViewController,它创建:
@property (nonatomic, strong) UILabel *aLabel;
Run Code Online (Sandbox Code Playgroud)
它使用了strong,而不是我在RayWenderlich网站上阅读的教程说:
但对于这两个特殊属性我还有其他计划.而不是
strong,我们将其声明为weak.
@property (nonatomic, weak) IBOutlet UITableView *tableView;
@property (nonatomic, weak) IBOutlet UISearchBar *searchBar;
Run Code Online (Sandbox Code Playgroud)
Weak是所有插座属性的推荐关系.这些视图对象已经是视图控制器视图层次结构的一部分,不需要在其他地方保留.声明出口的最大好处weak是可以节省编写viewDidUnload方法的时间.目前我们
viewDidUnload看起来像这样:
- (void)viewDidUnload
{
[super viewDidUnload];
self.tableView = nil;
self.searchBar = nil;
soundEffect = nil;
}
Run Code Online (Sandbox Code Playgroud)
您现在可以将其简化为以下内容:
- (void)viewDidUnload
{
[super viewDidUnload];
soundEffect = nil;
}
Run Code Online (Sandbox Code Playgroud)
所以使用weak,而不是strong,并删除设置为nil videDidUnload,而不是Xcode使用strong,并使用self... = nil中viewDidUnload.
我的问题是:我何时必须使用strong,何时使用weak?我也想用于部署目标iOS 4,那么我何时才能使用unsafe_unretain?任何人都可以通过一个小教程,使用strong时weak和unsafe_unretainARC 来帮助解释我吗?
Lor*_*o B 69
经验法则
当父对象具有对子对象的strong引用时,应使用引用.当子项具有对其父对象的引用时,应使用weak引用或一个引用 unsafe_unretained(如果前者不可用).一个典型的场景是你处理代表.例如,a UITableViewDelegate不保留包含表视图的控制器类.

这里有一个简单的架构来介绍主要概念.
假设第一个A,B和C是strong参考.特别是,C strong对其父母有一个参考.当obj1被释放(某处)时,A引用不再存在但是你有泄漏,因为obj1和obj2之间有一个循环.就保留计数而言(仅出于解释目的),obj1的保留计数为2(obj2具有strong对它的引用),而obj2的保留计数为1.如果释放obj1,则其保留计数现在为1且它的dealloc方法没有被调用.obj1和obj2仍然留在内存中,但没有人引用它们:泄漏.
在contary上,如果只有A和B是strongrefs而C是合格的,那么weak一切都可以.你没有泄漏.实际上,当obj1被释放时,它也会释放obj2.就保留计数而言,obj1的保留计数为1,obj2的保留计数为1.如果释放obj1,则其保留计数现在为0并且dealloc调用其方法.obj1和obj2从内存中删除.
一个简单的建议:当你处理ARC时,开始用对象图来思考.
关于您的第一个问题,两种解决方案在您处理XIB时都是有效的.通常,weak在处理内存周期时会使用引用.关于XIB文件,如果使用,则strong需要设置nil,viewDidUnload因为如果不这样做,在内存不足的情况下,可能会导致意外泄漏.你不会发布它们,dealloc因为ARC会为你做这件事.
weak相反,不需要那种处理,因为当目标对象被销毁时,这些值被nil自动设置.没有悬空指针了.
如果你有兴趣,我真的建议你阅读周五-QA-2012-04-13-笔尖内存管理由迈克灰.
关于你的第二个问题,如果你需要支持iOS 4,而不是weak你必须使用unsafe_unretained.
在SO内有很多问题/答案.这里主要是:
Objective-C中的自动引用计数不会阻止或最小化哪种泄漏?
使用ARC,生命周期限定符分配和unsafe_unretained
strong/weak/retain/unsafe_unretained/assign
希望有所帮助.
更新
根据shaunlim的评论,从iOS 6 viewDidUnload方法开始不推荐使用.在这里,我真的建议看看Rob的答案:iOS 6 - viewDidUnload迁移到didReceiveMemoryWarning?.
| 归档时间: |
|
| 查看次数: |
22377 次 |
| 最近记录: |