请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

__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?

正在回答 回答被采纳积分+3

1回答

于海 2021-10-25 17:47:53

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

0 回复 有任何疑惑可以回复我~
  • 提问者 慕莱坞1578890 #1
    定义阶段没有发生为难量截获 那这样为什么结果是 50 不是30?
    int var = 10;
    
    int (^ aa) (int num) = ^int(int num){
      
        return num*var;
    };
    var = 6;
    int x = aa(5);
    
    NSLog(@"result = %d", x);
    回复 有任何疑惑可以回复我~ 2021-10-25 17:55:11
  • 清风淡墨白 回复 提问者 慕莱坞1578890 #2
    这样的话,在编译的阶段 截获了 var的值  在blcok运算的的是10, 你最开始的问题用__block修饰后 变量在编译过程中编程了 对象带有forwarding 指针  后面修改值 指针重新指向了新值  所以 第一次结果30  第二次结果50
    回复 有任何疑惑可以回复我~ 2021-12-04 15:00:08
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信