Block原理

2018-04-16  本文已影响5人  CoderLF
为什么不允许block修改外部变量

Block不允许修改外部变量的值Apple这样设计,应该是考虑到了block的特殊性,block也属于“函数”的范畴,变量进入block,实际就是已经改变了作用域。在几个作用域之间进行切换时,如果不加上这样的限制,变量的可维护性将大大降低。又比如我想在block内声明了一个与外部同名的变量,此时是允许呢还是不允许呢?只有加上了这样的限制,这样的情景才能实现。

在block内如何修改block外部变量?

默认情况下,在block中访问的外部变量是复制过去的,即:写操作不对原变量生效。但是你可以加上 __block 来让其写操作生效。

我们都知道:Block不允许修改外部变量的值,这里所说的外部变量的值,指的是栈中指针的内存地址。__block 所起到的作用就是只要观察到该变量被 block 所持有,就将“外部变量”在栈中的内存地址放到了堆中,同时block也会被复制到堆中,进而在block内部也可以修改外部变量的值。

对于非对象的变量被block使用来说:

用__block修饰的变量可以在block中被修改的原理:

在Block中修改自动变量的两种方法:
对于对象来说:
什么时候栈上的Block会被复制到堆上呢?

1、调用Block的copy实例方法时
2、 Block作为函数返回值返回时
3、将Block赋值给附有__strong修饰符id类型的类或Block类型成员变量时
4、在方法名中含有usingBlock的Cocoa框架方法或GCD的API中传递Block时

循环引用问题

原因:Block中附有__strong修饰符的对象类型自动变量在从栈复制到堆上时,该对象会被Block所持有。

解决方案:

原理:
如果对block做一次copy操作, block的内存就会在堆中

参考文章1
参考文章2

上一篇 下一篇

猜你喜欢

热点阅读