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