其实这俩个东西是八竿子打不着的存在,但是我看很多人会分别用于mrc与arc下block避免循环引用,之前我用着也是一头雾水。后来似乎明白了,现在解释一下
__block是一个存储域说明符。如果你只学过oc的话,你肯定不明白啥意思,但是你如果学过c语言的话,可能还有点概念,其实它类似于static,auto等,标明变量的存储区域。
在C语言中,数据存储区域分为如下四项
全局区:用于存储变量和static变量
常量区:存放常量的地方(const修饰,与变量相反,如果你有点swift常识的话,可能会更好理解,就是var和let的区别)
栈区:系统自动给局部变量分配的内存区
堆区:用户申请的内存区,用编译器提供的函数new或malloc申请。
所以__block修饰的对象是存储在什么区域呢,这还和block本身所在的存储区域有关,一句话俩句话以后再说。
总之__block是一个存储域说明符。
__weak却是一个所有权修饰符。表明对象所有权,最明显的对比为__strong,我感觉是应用arc产生的一个东西。
但考虑一下我们在block为了避免死循环真正的原理,所有其实mrc下__block用来避免循环引用并不是完全的正解,而arc下__weak用来避免循环循环却是当之无愧。。
后来,我了解到mrc,标明__block的变量在block copy的时候是不会被retain的,引用计数不增加,所以引用计数最多就是1,所以OC顺利的把俩个八竿子打不着的东西用到了一个地方。