block的原理是怎样的?本质是什么?
- 本质就是一个封装了函数调用
impl.FuncPtr以及函数调用环境函数需要的参数的OC对象impl.isa

Block的本质.jpg

Block的结构.jpg

Block的循环引用.jpg

__block的__forwarding指针.jpg
__block的作用是什么?有什么使用注意点?
被
__block修饰的变量会被包装成另一种对象,可以用于解决block内部无法修改auto变量值的问题,先通过这个对象再通过__forwarding指针就可以访问到那个变量进行修改注意内存管理的问题,如果修饰的是对象,
block拷贝到堆上时,在ARC环境下会对对象做retain操作,而MRC环境下则不会。

__block的内存管理(释放).jpg

__block的内存管理(引用).jpg

Block捕获的对象类型的auto变量.jpg

MRC解决循环引用问题.jpg

Block的变量捕获.jpg
block的属性修饰词为什么是copy?使用block有哪些使用注意?
- block一旦没有进行copy操作就不会在堆上,拷贝在堆上是为了控制block的生命周期,进行内存管理
- 使用注意:循环引用

ARC解决循环引用问题.jpg
block在修改NSMutableArray,需不需要添加__block?
- 不需要,
NSMutableArray有相应的api来修改数组内容,这是直接使用这个变量,而不是修改这个变量,所以不需要__block修饰, -
__block能不加就尽量不加,加了数据结构就变得复杂,会生成一个额外的结构体

Block和__block的内存管理.jpg

__block修饰符.jpg

对象类型的__blcok变量的内存管理.jpg

对象类型的__blcok变量和auto变量.jpg