block(2) - 变量与block

本文探讨了Block(代码块)与不同类型的变量(本地、全局、静态全局、静态局部)之间的关系及其变化。通过分析转换后的C++代码,提出并解答了关于变量地址变化、值的传递以及Block内修改变量值的限制等问题。重点讨论了Block内部无法直接修改变量值的原因,以及为何在某些情况下取地址修改变量能成功。
摘要由CSDN通过智能技术生成

block和variable

1、本地变量与block的关系及其变化
        int main(int argc, const char * argv[]) {
    @autoreleasepool {

        int a = 10;
        int b = 20;

        NSLog(@"&a:%p ,&b:%p ,a:%d ,b:%d",&a,&b,a,b);
        //&a:0x7ffeefbff63c ,&b:0x7ffeefbff638 ,a:10 ,b:20

        int (^block)(void) = ^(void)
        {
            NSLog(@"&a:%p ,&b:%p ,a:%d ,b:%d",&a,&b,a,b);
            //&a:0x1005035f0 ,&b:0x1005035f4 ,a:10 ,b:20 
            //疑问 1:为什么代码块里面的a和b的地址改变了?
            //a = 12; 如果这样做会报错
            //b = 13; 如果这样做会报错
            //疑问 3:为什么在block内部修改不了a,b的值?
            //int *p = (int *)&a;     //疑问 4:为什么这样的修改成功了?
            //*p = 12;
            return a + b;
        };

        NSLog(@"&a:%p ,&b:%p ,a:%d ,b:%d",&a,&b,a,b);
        //&a:0x7ffeefbff63c ,&b:0x7ffeefbff638 ,a:10 ,b:20
        NSLog(@"%d",block());    //30

        a = 11;
        b = 22;

        NSLog(@"&a:%p ,&b:%p ,a:%d ,b:%d",&a,&b,a,b);
        //&a:0x7ffeefbff63c ,&b:0x7ffeefbff638 ,a:11 ,b:22
        NSLog(@"%d",block());     //30
        //疑问 2:为什么a和b的外部值改变了没有影响代码块里的?
    }
    return 0;
}

转换后的cpp代码

int main(int argc, const char * argv[]) {
    /* @autoreleasepool */ { __AtAutoreleasePool __autoreleasepool; 

        int a = 10;
        int b = 20;

        NSLog((NSString *)&__NSConstantStringImpl__var_folders_sz_wcgbthq12mv1dp_m892vbz000000gn_T_main_c15216_mi_0,&a,&b,a,b);
        //输出的是&a,&b,a,b

        int (*block)(void) = ((int (*)())&__main_block_impl_0((void *)__main_block_func_0, &__main_block_desc_0_DATA, a, b));
        //填充__main_block_impl_0结构体,__main_block_func_0为block代码实现函数,
        //__main_block_desc_0_DATA为描述block的结构体变量
        //注意这里a,b是传值

        NSLog((NSString *)&__NSConstantStringImpl__var_folders_sz_wcgbthq12mv1dp_m892vbz000000gn_T_main_c15216_mi_2,&a,&b,a,b);
        //输出的是&a,&b,a,b

        NSLog((NSString *)&__NSConstantStringImpl__var_folders_sz_wcgbthq12mv1dp_m892vbz000000gn_T_main_c15216_mi_3,((int (*)(__block_impl *))((__block_impl *)block)->FuncPtr)((__block_impl *)block));
        //利用FuncPtr指针调用__main_block_func_0函数

        a = 11;
        b = 22;

        NSLog((NSString *)&__NSConstantStringImpl__var_folders_sz_wcgbthq12mv1dp_m892vbz000000gn_T_main_c15216_mi_4,&a,&b,a,b);
        //输出的是&a,&b,a&#x
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值