IBOutlet和其他弱者或弱者

Pie*_*ero 32 weak-references ios ios5 automatic-ref-counting strong-references

我已将项目切换到ARC,我不明白是否必须使用strongweak用于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... = nilviewDidUnload.

我的问题是:我何时必须使用strong,何时使用weak?我也想用于部署目标iOS 4,那么我何时才能使用unsafe_unretain?任何人都可以通过一个小教程,使用strongweakunsafe_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内有很多问题/答案.这里主要是:

如何在使用ARC和定位iOS 4.0时替换弱引用?

Objective-C中的自动引用计数不会阻止或最小化哪种泄漏?

使用ARC,生命周期限定符分配和unsafe_unretained

strong/weak/retain/unsafe_unretained/assign

希望有所帮助.

更新

根据shaunlim的评论,从iOS 6 viewDidUnload方法开始不推荐使用.在这里,我真的建议看看Rob的答案:iOS 6 - viewDidUnload迁移到didReceiveMemoryWarning?.


das*_*dom 11

对于通过IBOutlets连接到IB中的对象的对象,可以使用weak,因为在这种情况下,只要superview存在,对象就会存在.这是因为superview具有指向其子视图的强大指针.

如果您定义的指针是指向对象的唯一指针,则应将其声明为强.

如果您是注册开发人员,我强烈建议您查看WWDC11和WWDC12中的视频.另一个很好的资源是来自斯坦福的iOS开发播客.


归档时间:

查看次数:

22377 次

最近记录:

10 年,11 月 前