iOS __block 关键字的底层实现原理 -- 堆栈地址的变更
默认情况下,在block中访问的外部变量是复制过去的。但是可以加上 __block 来让其写操作生效。
原理:
Block 不允许修改外部变量的值,这里所说的外部变量的值,指的是栈中指针的内存地址。
__block 所起到的作用就是只要观察到该变量被 block 所持有,就将 外部变量 在栈中的内存地址放到了堆中。进而在 block 内部也可以修改外部变量的值。
Block 不允许修改外部变量的值,是考虑到了block的特性,block也属于 函数 的范畴,变量进入block,实际就是已经该变了作用域。在几个作用域之间进行切换,如果不加上这样的限制,变量的可维护性将大大降低。