Block相关面试问题

Block相关面试问题:

屏幕快照 2018-11-26 下午6.37.02.png

什么是 Block?

block是将函数及其执行上下文封装起来的对象

屏幕快照 2018-11-26 下午6.40.22.png

Block里面有isa指针 所以是一个对象

Block的调用即是函数的调用

Block的调用即是函数的调用

Block截获变量

局部变量

基本数据类型 ---> 截获其值
对象类型 ---> 连同所有权修饰符一起截获

静态局部变量

以指针形式截获局部变量

全局变量 && 静态全区变量

不截获

屏幕快照 2018-11-26 下午6.50.33.png

__Block 修饰符相关问题

什么情况需要 __block ??

一般情况下, 对截获变量进行赋值的操作添加__block修饰符

需要block修饰

不需要block修饰

__Block修饰符作用

笔试题:


屏幕快照 2018-11-26 下午7.01.16.png

他修饰的变量变成了对象

__Block修饰符后变量被修改成一个struct
栈上的forwarding指向自身

forwarding 指针用来干什么的???

Block内存管理

栈上的block的销毁


栈上的block的销毁

栈上的Block Copy操作


栈上的Block Copy操作

栈上的__block变量的Copy操作

屏幕快照 2018-11-26 下午7.07.52.png

栈上的__forwarld指针指向堆上的 __block变量
堆上的__forwarding指针指向自己,必须对栈上 变量 Copy 才能改变__forwarding指针

结果为24 PPT错误

__forwarding指针存在的意义

不论在审核内存位置
都可以顺利的访问同一个__block变量

Block循环引用

屏幕快照 2018-11-26 下午7.19.25.png

MRC下 不会产生循环引用
ARC会产生循环引用,引起内存泄漏

解决方案


屏幕快照 2018-11-26 下午7.28.09.png

你可能感兴趣的:(Block相关面试问题)