Block循环引用的一些见解希望能帮助到即将阅读的你
首先我们来了解下堆与栈的区别
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其
操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回
收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的
全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另
一块区域。 - 程序结束后由系统释放。
👇我们开始正题
block在创建的时候,它的内存是分配在栈(stack)上,而不是在堆(heap)上。因为block变量默认是声明为栈变量的,为了能够在block的声明域外使用,所以要把block拷贝(copy)到堆,所以说为了block属性声明和实际的操作一致,最好声明为copy。
copy最主要的事就是计数加1拷贝到堆 所以说用Strong也是可行的 。前提是在ARC环境下
将block带入堆中的一个问题就是self会持有Block的引用。那么在block中使用self会导致循环引用,故要弱化self来解决循环引用。
Block的变量复制
借用网上一个图来说明
详情见 --谈Objective-C Block的实现(转载唐巧)