一:Block本质
问:block是什么? block的本质是什么?
1.block本质上也是一个oc对象
2.block是封装了函数调用以及函数调用环境的oc对象
3.block 是封装函数及其上下文的oc对象
二:block的变量捕获
对于auto变量block访问是值传递,static变量block访问方法是指针传递. block 不捕获全局变量,都是直接采用取值的.
问:为什么局部变量需要捕获
考虑作用域的问题,需要跨函数访问,就需要捕获 block 对self 也是会捕获的
三:block的类型
block 一共有三种类型.
-
NSGlobalBlock 在数据区
-
__NSStackBlock __ 在栈区
-
__NSMallocBlock __ 在堆区
四:block类型判断
- blcok类型判断:根据是否访问auto变量,来区分.没有访问auto变量则是 globalBlock,反之则是stackBlcok.对stackblock进行copy操作 会转为 mallocblock.
- 储存位置globalBlock 在数据区,stack在栈区.malloc在堆上.
五:block 修改nsmutablearry
如果是只是往数组里面添加元素,则不需要使用 __block 但是如果要修改数组本身比如要初始化,那就需要使用