iOS __block修饰变量时的底层原理

总结:为什么Block内部不能改变自动变量(就是局部变量)的值

自动变量是以值传递方式传递到Block的构造函数里面去的。Block只捕获Block中会用到的变量。由于只捕获了自动变量的值,并没存地址,所以Block内部不能改变自动变量的值。Block捕获的外部变量可以改变值的是静态变量,静态全局变量,全局变量

拓展:

1.MRC下使用__block解决循环引用的原理

Block在捕获住__block变量之后,并不会复制到堆上,所以地址也一直都在栈上。这与ARC环境下的不一样。


图片发自App


2.:ARC 和 MRC 对比:

ARC环境下,一旦Block赋值就会触发copy,__block就会copy到堆上,Block也是__NSMallocBlock。ARC环境下也是存在__NSStackBlock的时候,这种情况下,__block就在栈上。

MRC环境下,只有copy,__block才会被复制到堆上,否则,__block一直都在栈上,block也只是NSStackBlock,这个时候\forwarding指针就只指向自己了。

你可能感兴趣的:(iOS __block修饰变量时的底层原理)