ARC机制之__strong详解

ARC机制之__strong详解


__strong  解析:


默认情况下,一个指针都会使用 __strong 属性,表明这是一个强引用。这意味着,只要引用存在,对象就不能被销毁。这是一种所期望的行为:当所有(强)引用都去除时,对象才能被收集和释放。


不过, 有时我们却希望禁用这种行为:一些集合类不应该增加其元素的引用,因为这会引起对象无法释放。在这种情况下,我们需要使用弱引用(不用担心,内置的集合类就是这么干的),使用 __weak 关键字。NSHashTable就是一个例子。当被引用的对象消失时,弱引用会自动设置为 nilCocoa Notification Center 就是这么一个例子,虽然这已经超出纯 Objective-C的语言范畴 



自己更深理解:

1.(weakstrong)不同的是:当一个对象不再有strong类型的指针指向它的时候,它就会被释放,即使改对象还有_weak类型的指针指向它;


在OC中strong就相当于retain属性,而weak相当于assign。只有一种情况你需要使用weak(默认是strong),就是为了避免retain cycles(就是父类中含有子类{父类retain了子类},子类中又调用了父类{子类又retain了父类},这样都无法release)

  2.一旦最后一个指向该对象的strong类型的指针离开,这个对象将被释放,如果这个时候还有weak指针指向该对象,则会清除掉所有剩余的weak指针


下面是笔者看书时遇到的疑问

(1) : __strong在ARC关闭时是否可用

(2): __strong修饰的变量,直接赋值时,赋值的变量的retain是否会自增(被赋值的变量retain是否会自减)

(3): __strong修饰的变量在超出其作用域时retain是否会自减


解答如下:

(1): 能

(2): 例如:

     int count  = 1;

    id __strong obj1 =nil;

        id __strong obj = [[NSObjectalloc] init];

        obj1 = obj;//obj1 持有obj 赋值对象的强引用 会导致obj retain自增

        NSLog(@"Retain count is %ld",CFGetRetainCount((__bridgeCFTypeRef)obj));

        NSLog(@"obj = %ld",CFGetRetainCount((__bridgeCFTypeRef)obj));

打印如下:

2015-07-22 17:23:22.169字典[724:25567] Retain count is 2

2015-07-22 17:23:22.171字典[724:25567] obj = 2

说明:(1) :当一个对象获得另一个对象的强引用时,retain++;

(2): 被赋值的变量retain是会自减

(3):

    int count  =1;

   id __strong obj1 =nil;

   if(count){

       id __strong obj = [[NSObjectalloc] init];

        obj1 = obj;//obj1 持有obj 赋值对象的强引用 会导致obj retain自增

        NSLog(@"Retain count is %ld",CFGetRetainCount((__bridgeCFTypeRef)obj));

    }

    

    NSLog(@"Retain count is %ld",CFGetRetainCount((__bridgeCFTypeRef)obj1));

__strong修饰的变量在超出其作用域时retain是会自减


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值