iOS面试题(五)-- Block相关

113 阅读2分钟

1.Block本质相关

1.1什么是BlocK? Block是将函数及其执行上下文封装起来的对象。 image.png

2.Block截获变量相关

image.png 2.1 局部变量:

对于基本数据类型的局部变量截获其值

对于对象类型的局部变量连同所有权修饰符一起截获

2.2 静态局部变量: 以指针形式截获局部静态变量

2.3 全局变量: 不截获全局变量

2.4 静态全局变量: 不截获静态全局变量

image.png image.png

3.__block修饰符相关

3.1 一般情况下,对被截获变量进行赋值操作需要添加__block修饰符 注意:赋值≠操作 image.png image.png 3.2 哪些情况下需要__block修饰符 image.png image.png 3.3 __block修饰的变量变成了对象 image.png

image.png

4.Block内存管管理

4.1 Block 的类型? impl.isa = &_NSConcreteStackBlock;

_NSConcreteGlobalBlock

_NSConcreteStackBlock

_NSConcreteMallocBlock

4.2 什么时候进行copy操作?

image.png 4.3 __forwarding 存在的意义?

不论在任何内存位置,都可以顺利访问同一个__block变量。

5.Block循环引用相关

5.1 问这段代码有问题吗? image.png 答: image.png

5.2 请思考这段代码有问题吗? image.png 答: image.png

image.png 这种解决方案有一个弊端,就是很长时间或者没有调用_blk的话,那么这个循环引用的环会一直存在。

5.3 为什么Block会产生循环引用?

1.如果说当前BlcoK对当前的对象的某一成员变量进行截获的话,那么这个Block会对对应变量有一个强引用,而Block又由于当前对象对其有一个强引用,所以就产生了自循环引用。可以通过声明__weak的方式进行消除。

2.如果说我们定义了一个__block说明符的话,也会产生循环引用,不过是区分场景的。ARC下会产生循环引用,而在MRC下不会,在ARC下可以通过断环的方式去解除循环引用,但是这种解决方案有一个弊端,就是很长时间或者没有调用_blk的话,那么这个循环引用的环会一直存在。