-
block的本质
-
block的种类及储存区域
-
__block的本质
-
block的循环引用
前言:
这里就不讨论block的具体写法及使用场景了,因为当你有一天想深入了解block 的底层原理时,你早已把block写了几十遍了。
一、block的本质:
block是带有自动变量的匿名函数。
注:
局部变量 = 自动变量(栈区)+ 静态局部变量 (全局区)
这里说的自动变量是指block里面捕获的外部局部变量,当然你也可以不捕获
二、block的种类及储存区域:
NSGlobalBlock :存放在全局区的block
只有当block里面仅仅捕获了外部的静态局部变量、全局变量、静态全局变量时,该block 存. 放在全局区。当然,如果block里面什么类型的外部变量都不捕获时,它也在全局区。
NSStackBlock : 存放在栈区的block
NSMallocBlock : 存放在堆区
在arc下,截获了外部自动变量的block被创建出来时存放在栈区,然后如果该block被strong/copy 修饰符修饰时,系统会将该block从栈区,copy一份到堆区,并将指针指向堆区的block。
而系统默认的就是strong类型