__block使用

__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]);
    };
复制代码
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值