OC-Block
Block在开发过程中是比较常用的技术
Block是什么
Block本质上也是一个OC对象,它内部也有个isa指针
Block是封装了函数调用以及函数调用环境的OC对象
总结:block是封装
函数及其上下文的OC对象
Block底层结构

Block的变量捕获(capture)

Block类型
| 类型 | 描述 | 
|---|---|
__NSGlobalBlock__ | 
没有访问auto变量 | 
__NSStackBlock__ | 
访问了auto变量 | 
__NSMallocBlock__ | 
__NSStackBlock__调用了copy | 
每种类型的Block调用copy后的结果如下所示
| Block类型 | 副本源的配置存储域 | 复制效果 | 
|---|---|---|
_NSConcreteStackBlock | 
栈 | 从栈拷贝到堆 | 
_NSConcreteGlobalBlock | 
程序的数据区域 | 什么也不做 | 
_NSConcreteMallocBlock | 
堆 | 引用计数增加 | 
栈上的Block是由系统进行分配和释放的,出了作用域就会被释放,所以需要copy拷贝到堆上。
ARC环境下,编译器哪些情况会从栈区拷贝到堆区
block作为函数返回时block赋值给__strong指针时block作为Cocoa API中方法名含有usingBlock的方法参数时block作为GCD API的方法参数时
__block
__block可以用来修改block内部无法修改auto变量的问题__block不能修饰全局变量、静态变量(static)- 编译器会将
__block修饰的变量包装成一个对象