关于Block

前段时间深受block循环引用的毒害,花时间研究下。

关于Block_第1张图片

一、Block是C语言的一种数据类型,是一段提前准备好的代码块,在需要的时候执行。

void (^myBlock)(int) = ^(int x) {};

inlineBlock可以速记block代码块格式


二、Block的应用场景:

1⃣️返回值

2⃣️视图控制器反向传值

3⃣️自定义视图的反向传值


三、进入block后,会copy外部变量到堆中


四、block内部不允许修改外部变量的值,可以使用__block将外部变量的地址指定为堆地址,这样就可以了


关于Block_第2张图片

五、block的保存位置

1⃣️不使用外部变量,block会保存在全局区

2⃣️使用外部变量:

*MRC:block存储在栈区,因为MRC下内存由程序员进行管理

*ARC:block存储在堆区,由编译器实现

*定义block属性的时候为何只用copy?

在MRC下,block保存在栈区,设置数值的时候才能保证将栈区的block拷贝到堆区,后来出现了ARC,也默认遵守此协议,

虽然编译器已经将其默认保存到堆区。

关于Block_第3张图片

六、面试题:

关于Block_第4张图片

关于Block_第5张图片

关于Block_第6张图片

关于Block_第7张图片

你可能感兴趣的:(关于Block)