__block使用

博客介绍了__block说明符和C语言数组相关知识。使用__block说明符可在Block语法表达式中给外部局部变量赋值,截获OC对象时调用变更方法无错,但重新赋值需添加__block;C语言数组解惑自动变量方法未实现截获,可使用指针解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

__block说明符

若想在Block语法的表达式中将值赋给在Block语法外面声明的局部变量,需要在自动变量前面附加__block说明符。

    __block int val = 0;
    void (^blk)(void) = ^{val = 1;};
    blk();
    printf("val = %d\n",val);

当截获的是Objective-C对象,调用变更该对象的方法则不会出现错误

    id array = [[NSMutableArray alloc] init];
    void (^blk)(void) = ^{
        id obj = [[NSObject alloc] init];
        [array addObject:obj];
    };

但是,如果我们重新给array赋值,就会报错。
可以理解为,对于OC对象,在block里面使用是可以的,但是如果想重新赋值,需要前面添加 __block

    __block id array = [[NSMutableArray alloc] init];
    void (^blk)(void) = ^{
        id obj = [[NSObject alloc] init];
        [array addObject:obj];
    };

C语言数组

const char text[] = "hello";
    void (^blk)(void) = ^{
        printf("%c\n",text[2]);
    };

这里只是使用C语言字符串字面量数组,而并没有向截获的变量赋值,但是解惑自动变量的方法并没有实现对C语言数组的截获,所以这里会报错;这里可以使用指针解决该问题:

const char *text = "hello";
    void (^blk)(void) = ^{
        printf("%c\n",text[2]);
    };
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值