一个int变量被 __block 修饰与否的区别?block的变量截获?
没有被__block修饰的int,block体中对这个变量的引用是值拷贝,在block中是不能被修改的。
通过__block修饰的int,block体中对这个变量的引用是指针拷贝,它会生成一个结构体,复制这个变量的指针引用,从而达到可以修改变量的作用。
关于block的变量截获:
block会将block体内引用外部变量的变量进行拷贝,将其拷贝到block的数据结构中,从而可以在block体内访问或修改外部变量。
外部变量未被__block修饰时,block数据结构中捕获的是外部变量的值,通过__block修饰时,则捕获的是对外部变量的指针引用。
注意:block内部访问全局变量时,全局变量不会被捕获到block数据结构中。
举个栗子:
未被__block修饰的情况
int param = 1;
int a = param; // 没用__block修饰的时候,block内部捕获的外部变量
[self updateInt:a];
NSLog(@"----:%@", @(param));// 这里输出:1
// 没用__block修饰的时候,block内部实现如下
- (void)updateInt:(int)a{
a = 2;// 此时对外部变量修改是无效的
}
被__block修饰的情况
int param = 1;
int *a = ¶m; // 用__block修饰的时候,block内部捕获的外部变量,是外部变量的指针
[self updateInt:a];
NSLog(@"----:%@", @(param));// 这里输出:2
// 用__block修饰的时候,block内部实现如下
- (void)updateInt:(int *)a{
*a = 2;// 此时对外部变量修改是有效的
}
参考这篇文章
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。