weak 、strong、 assign 、nonatomic修饰

Weak

weak 表示指向,但不持有该对象,其实修饰的对象引用计数不会增加。

__weak与Weak 基本相同,前者修饰变量(variable),后者用于修饰属性(property)。__weak 主要防止block中的循环引用。

weak   实现的三步骤:

  •  object_InitWeak  (初始化新的weak指针指向对象的地址)
  •  store_weak (更新指针的指向,创建弱引用表)
  •  weak_register_no_lock(通过哈希运算拿到弱应用表)

Strong

表示指向并持有该对象,起修饰的对象引用计数+1,该对象只要引用计数不为0,就不会被销毁,当然也可以设置为nil强行销毁。

    __weak typeof (self)weakSelf = self;
    self.block =^{
       // 1
        weakSelf.p = "123";
        __strong typeof (self)strongSelf = weakSelf;
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
           //2
            strongSelf.p = "321";
        });
    };
    self.block();

在一个block内,为了调用(1)当前对象p,给self进行弱引用__weak 处理。

在block中,有一个GCD的延时操作,里边想调用对象p,  按照执行顺序,当block执行结束,作用域会销毁。那么weak 机会被释放->nil。 strongSelf修饰weakSelf,在block内引用计数+1,出了作用域block销毁(延时任务执行完毕后, strongSelf 会被回收)。

Assign

主要修饰基本数据类型,如NSinteger、CGFloat,这些数值主要存在于栈中。

如果用assign修饰对象, 对象被释放后,指针的地址依然存在,会造成“野指针”,在堆上容易造成奔溃。而栈上的内存系统会自动处理。

 

nontamic 与atomic 区别

atomic 修饰的对象会保证setter和getter方法的完整性,任何线程访问题都可以得到一个完整的的初始化后的对象。因为要保证完整性,所以比较耗时。相对于nonatomic较为安全。(非绝对安全,多线程资源抢夺也会得到不一样的值, 也得使用@synchronized)

nontamic 修饰的对象不会保证setter和getter方法的完整性,任何线程访问题不一定得到一个完整的的初始化后的对象,正因为如此,他比atomic的速度快。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
我明白了,你要求将一个弱引用分配给一个变量。在 C++ 中,可以通过使用 `std::weak_ptr` 来实现弱引用。`std::weak_ptr` 是一种智能指针,可以用于跟踪 `std::shared_ptr` 的生命周期。这样,当 `std::shared_ptr` 所管理的对象被销毁时,`std::weak_ptr` 会自动失效。下面是一个简单的示例代码: ```cpp #include <iostream> #include <memory> int main() { std::shared_ptr<int> sharedPtr = std::make_shared<int>(42); std::weak_ptr<int> weakPtr = sharedPtr; // 使用 weakPtr 获取对象的值 if (auto lockedPtr = weakPtr.lock()) { std::cout << "Weak pointer value: " << *lockedPtr << std::endl; } else { std::cout << "Weak pointer expired" << std::endl; } // 销毁 sharedPtr sharedPtr.reset(); // 再次尝试使用 weakPtr 获取对象的值 if (auto lockedPtr = weakPtr.lock()) { std::cout << "Weak pointer value: " << *lockedPtr << std::endl; } else { std::cout << "Weak pointer expired" << std::endl; } return 0; } ``` 在这个示例中,`sharedPtr` 是一个 `std::shared_ptr`,并且我们使用它创建了一个 `std::weak_ptr`,即 `weakPtr`。我们可以通过调用 `lock()` 方法来检查 `weakPtr` 是否有效,如果有效,就可以使用它来获取所管理的对象的值。当 `sharedPtr` 被 `reset()` 销毁后,再次使用 `weakPtr` 时,`lock()` 方法将返回一个空指针,表示弱引用已经失效。 希望这个示例能对你有所帮助!如果你有任何疑问,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值