arc下控件声明用strong还是weak

来源:互联网 发布:mac双系统安装教程win7 编辑:程序博客网 时间:2024/05/16 09:11


http://www.cocoachina.com/ask/questions/show/108308



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

  • strong
  • weak
  • unsafe_unretained
  • autoreleasing

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

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

    2.weak
    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。

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


  • 1 0