前段时间深受block循环引用的毒害,花时间研究下。
一、Block是C语言的一种数据类型,是一段提前准备好的代码块,在需要的时候执行。
void (^myBlock)(int) = ^(int x) {};
inlineBlock可以速记block代码块格式
二、Block的应用场景:
1⃣️返回值
2⃣️视图控制器反向传值
3⃣️自定义视图的反向传值
三、进入block后,会copy外部变量到堆中
四、block内部不允许修改外部变量的值,可以使用__block将外部变量的地址指定为堆地址,这样就可以了
五、block的保存位置
1⃣️不使用外部变量,block会保存在全局区
2⃣️使用外部变量:
*MRC:block存储在栈区,因为MRC下内存由程序员进行管理
*ARC:block存储在堆区,由编译器实现
*定义block属性的时候为何只用copy?
在MRC下,block保存在栈区,设置数值的时候才能保证将栈区的block拷贝到堆区,后来出现了ARC,也默认遵守此协议,
虽然编译器已经将其默认保存到堆区。
六、面试题:
①
②
③
④