__block使用

2,231 阅读1分钟

__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]);
    };