强引用和弱引用(__strong和__weak)

初学者干货奋斗

 

在OC ARC模式下开发:

id objcA =[ [NSObject alloc] init];

默认声明的一个对象就为__strong强引用,等价于:

id __strong objcA =[ [NSObject alloc] init];

 

注:在强引用中,有时会出现循环引用的情况,这时就需要弱引用(__weak)来帮忙 ,如本博客里面提到的block的循环引用(retain cycle)

 

* 强引用弱引用的区别?

  1、强引用持有对象,弱引用不持有对象。

  2、强引用可以释放对象,但弱引用不可以,因为弱引用不持有对象,当弱引用指向一个强引用所持有的对象时,当强引用将对象释放掉后,弱引用会自动的被赋值为nil,即弱

        引 用会自动的指向nil。

 

代码示例:

int main( int argc, const char * argv[]) {
    @autoreleasepool {
        id __weak objA = nil;
        if (YES) {
            id objB = [[NSObject alloc] init];
            objA = objB;
            NSLog(@ "objA: %@" , objA);
        }
        NSLog(@ "objA: %@" , objA);
    }
    return 0;
}

输出结果:

   objA: <NSObject: 0x1003066c0>

 objA: (null)

 
分析:
    因为objB生成的默认的为强引用(__strong),在超出if的作用域之后,objB所持有的对象被释放,
     objA为弱引用,所以objA不持有对象,在objB对象释放后,objA自动的被赋值为nil
    弱引用的特性是,不持有对象,即便是写成id __weak objB = [[NSObject alloc] init];
    此代码系统会给与警告,因为这里objB被声明成弱引用,那么在赋值之后,alloc出来的对象会被立即释放。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: compare_exchange_weak是C++11中的一个原子操作函数,用于比较并交换操作。它可以在多线程环境下保证数据的原子性,避免出现数据竞争的情况。与compare_exchange_strong相比,它的版本在交换操作失败时不会抛出异常,而是返回一个bool值表示操作是否成功。 ### 回答2: compare_exchange_weak是C++中的原子操作函数之一。它的作用是比较给定的值和内存中的值,如果相等,则将内存中的值替换为一个新的值。 compare_exchange_weak函数的使用方式如下: ``` bool compare_exchange_weak(T& expected, T desired); ``` 其中,expected是一个引用参数,表示期望的值;desired是新的值。函数首先比较内存中的值和expected,如果相等,则将内存中的值替换为desired并返回true;如果不相等,则将内存中的值赋给expected并返回false。 compare_exchange_weak函数是的比较和替换原子操作。之所以称为"",是因为它在比较和替换期间可能会受到其他线程的干扰,需要重试。这种重试可以保证代码的正确性,但可能会影响性能。 与之相对的是compare_exchange_strong函数,它是""的比较和替换原子操作。compare_exchange_strong函数不需要重试,因此使用起来更简单,但有可能导致不必要的循环开销。 需要注意的是,compare_exchange_weak函数的返回值不仅表示比较和替换的结果,还表示内存中的值是否被替换。因此,在使用该函数时,需要根据返回值判断操作是否成功。 总之,compare_exchange_weak是C++中的原子操作函数,用于比较给定值和内存中的值,并在相等时替换。它是一种的比较和替换操作,可能需要重试以保证正确性。 ### 回答3: compare_exchange_weak是一种原子操作,其目的是在多线程环境下实现对共享变量的原子比较和交换操作。在C++中,compare_exchange_weak函数通常与一个参数一起使用,该参数用于表示预期值。此函数会比较共享变量的值与预期值是否相等,如果相等,则将共享变量的值修改为新值,返回true;如果不相等,则不进行修改,返回false。 与compare_exchange_strong函数相比,compare_exchange_weak函数在性能上可能略有优势,但在并发度较高的情况下,可能会出现一些问题,因为它可能会被其他线程中断,导致原子操作失败。在这种情况下,函数会返回false,但同时还会返回共享变量的当前值,并将预期值修改为当前值。 compare_exchange_weak函数通常与循环结合使用,以确保原子操作的成功。在循环中,可以不断尝试进行原子操作,直到成功为止。这种方法可以有效地避免由于竞态条件而导致的共享变量值的错误结果。 总而言之,compare_exchange_weak函数是一种用于实现原子比较和交换操作的方式。尽管它在某些情况下可能会失败,但通过循环的方式,我们可以确保操作的成功,并保证共享变量的一致性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值