__block使用

chenshipeng發表於2019-03-11

__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]);
    };
複製程式碼

相關文章