1.Block本质相关
1.1什么是BlocK?
Block是将函数及其执行上下文封装起来的对象。
2.Block截获变量相关
2.1 局部变量:
对于基本数据类型的局部变量截获其值
对于对象类型的局部变量连同所有权修饰符一起截获
2.2 静态局部变量: 以指针形式截获局部静态变量
2.3 全局变量: 不截获全局变量
2.4 静态全局变量: 不截获静态全局变量
3.__block修饰符相关
3.1 一般情况下,对被截获变量进行赋值操作需要添加__block修饰符
注意:赋值≠操作
3.2 哪些情况下需要__block修饰符
3.3 __block修饰的变量变成了对象
4.Block内存管管理
4.1 Block 的类型? impl.isa = &_NSConcreteStackBlock;
_NSConcreteGlobalBlock
_NSConcreteStackBlock
_NSConcreteMallocBlock
4.2 什么时候进行copy操作?
4.3 __forwarding 存在的意义?
不论在任何内存位置,都可以顺利访问同一个__block变量。
5.Block循环引用相关
5.1 问这段代码有问题吗?
答:
5.2 请思考这段代码有问题吗?
答:
这种解决方案有一个弊端,就是很长时间或者没有调用_blk的话,那么这个循环引用的环会一直存在。
5.3 为什么Block会产生循环引用?
1.如果说当前BlcoK对当前的对象的某一成员变量进行截获的话,那么这个Block会对对应变量有一个强引用,而Block又由于当前对象对其有一个强引用,所以就产生了自循环引用。可以通过声明__weak的方式进行消除。
2.如果说我们定义了一个__block说明符的话,也会产生循环引用,不过是区分场景的。ARC下会产生循环引用,而在MRC下不会,在ARC下可以通过断环的方式去解除循环引用,但是这种解决方案有一个弊端,就是很长时间或者没有调用_blk的话,那么这个循环引用的环会一直存在。