您的位置:首页 > 其它

block 对外部引用变量的处理

2015-12-14 14:34 225 查看


block 对外部引用变量的处理

MRC 环境

一、静态变量 和 全局变量 在加和不加 __block 都会直接引用变量地址。也就意味着 可以修改变量的值。在没有加__block 参数的情况下。

全局block 和 栈block 区别为 是否引用了外部变量,堆block 则是对栈block copy 得来。对全局block copy 不会有任何作用,返回的依然是全局block。

二, 常量变量(NSString *a = @"hello";a 为常量变量,@“hello”为常量。)-----不加__block类型 block 会引用常量的地址(浅拷贝)。加__block类型 block会去引用常量变量(如:a变量,a = @"abc".可以任意修改a 指向的内容。)的地址。

如果不加__block 直接在block 内部修改变量 ,会编译报错。block 内部改变量是 只读的。
但是 就一定可以推断 block 会深拷贝 该变量吗???
对于常量 @“hello” 存储在 内存中的常量区, 程序结束才会释放 内存。 如:
NSString *str = @"hello";
NSString *abcStr = @"hello";
编译器会优化处理, str 和 abcStr 都会指向 常量区的@“hello” 地址。

NSString *str = @"hello";
void (^print)(void) = ^{
NSLog(@"block=str======%p",str);
}
str = @"hello1";
print();


block 会拷贝变量内容到自己的栈内存上,以便执行时可以调用。 但并不是对str 内容做了深拷贝,重新申请内存。
因为str 是栈内存上的变量,指向 一个常量区的@“hello”. 编译器做的优化是 当block 去拷贝str 指向内容时发现是个常量,
所以会去引用 @“hello” 的指针,没必要再取申请一块内存。

转至于
/article/4888919.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: