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