ARC在IBOutlet属性中的使用

来源:互联网 发布:打开钱箱的软件 编辑:程序博客网 时间:2024/04/30 10:41

转自:http://nijino.cn/blog/2013/06/24/iboutlet-arc/

ARC提供四种所有权修饰符:

  • strong
  • weak
  • unsafe_unretained
  • autoreleasing

其中前三个可以用于属性中声明所有权。对于这三个用于属性声明的修饰符,下面分别讲讲他们对应的使用场景。

  1. strong:与之前的retain差不多,可以增加属性引用计数的值。在不需要的时候,需要手动设置属性为nil。

  2. weak:是iOS5及以上才支持的修饰符。它被称为“归零弱引用”。可以只是持有指针而不增加引用计数来避免循环保留。当指针指向的内存被销毁后,声明weak的属性指针会自动置为nil,这也是它被称为归零弱引用的原因。

  3. unsafe_unretained:对于iOS5以下版本,并不支持ARC中的weak声明,可以用unsafe_unretained声明来代替weak。unsafe_unretained同样也是不增加引用计数的值,但它没有“归零”的动作,需要手动操作,一般作为支持iOS5以下weak的替代方案。

解释了3种属性的意义,下面说说对于属性声明为IBOutlet时3种所有权修饰符的取舍以及使用技巧。
由于我自己很熟悉Interface Bulider中的操作,所以非常喜欢那种拉控件然后连线并直接声称属性代码的操作。对于直接从xib或者storyboard拉出来生成的IBOutlet属性,一般是选择strong还是weak呢?

这里有个原则:

如果该控件位于控件树的顶部,比如 UIViewController下的view,那就应该选择strong,因为viewcontroller直接拥有该view。例如右图中的View。

而如果控件是viewcontroller中view的子视图,对于这个子视图,它的所有者是它的父视图,代码中只是想引用一下这个子视图的指针而已,那么就应该选择weak(iOS5以下选择unsafe_unretained)。例如左图中的UILabel。

对于以上的概念,我用一张图表来说明: 


0 0
原创粉丝点击