如果不block 不用copy, 为什么__block变量也变了?

来源:7-4 Block内存管理相关面试问题

慕莱坞1578890

2021-10-21

__block int var = 10;

int (^ aa) (int num) = ^int(int num){
  
    return num*var;
};
var = 6;
int x = aa(5);

NSLog(@"result = %d", x);

问一下这什么这样在栈上定义的block 执行的值也是30而不是50?

写回答

1回答

于海

2021-10-25

定义阶段并没有发生变量截获。可以按照课程提供的clang方式编译下看看这段代码的编译结果

0
2
清风淡墨白
回复
慕莱坞1578890
这样的话,在编译的阶段 截获了 var的值 在blcok运算的的是10, 你最开始的问题用__block修饰后 变量在编译过程中编程了 对象带有forwarding 指针 后面修改值 指针重新指向了新值 所以 第一次结果30 第二次结果50
2021-12-04
共2条回复

资深大牛带你深度剖析ios高级面试

从BAT/TMD名企真题入手,结合源码及应用,构建完整iOS知识体系

1749 学习 · 600 问题

查看课程