__block与__weak


其实这俩个东西是八竿子打不着的存在,但是我看很多人会分别用于mrcarcblock避免循环引用,之前我用着也是一头雾水。后来似乎明白了,现在解释一下


__block是一个存储域说明符。如果你只学过oc的话,你肯定不明白啥意思,但是你如果学过c语言的话,可能还有点概念,其实它类似于static,auto等,标明变量的存储区域。


在C语言中,数据存储区域分为如下四项

全局区:用于存储变量和static变量

常量区:存放常量的地方(const修饰,与变量相反,如果你有点swift常识的话,可能会更好理解,就是var和let的区别)

栈区:系统自动给局部变量分配的内存区

堆区:用户申请的内存区,用编译器提供的函数newmalloc申请。


所以__block修饰的对象是存储在什么区域呢,这还和block本身所在的存储区域有关,一句话俩句话以后再说。


总之__block是一个存储域说明符。


__weak却是一个所有权修饰符。表明对象所有权,最明显的对比为__strong,我感觉是应用arc产生的一个东西。


但考虑一下我们在block为了避免死循环真正的原理,所有其实mrc下__block用来避免循环引用并不是完全的正解,而arc下__weak用来避免循环循环却是当之无愧。。


后来,我了解到mrc,标明__block的变量在block copy的时候是不会被retain的,引用计数不增加,所以引用计数最多就是1,所以OC顺利的把俩个八竿子打不着的东西用到了一个地方。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值