-
[轉(zhuǎn)載]Objective-C 中的 __block 是什么意思?
__block 的標(biāo)記告訴編譯器媒怯,這個變量在 block 里面需要做特殊處理灿巧。
一般來說,在 block 中用的變量值是被復(fù)制過來的经柴,所以對于變量本身的修改并不會影響這個變量的真實(shí)值。而當(dāng)我們用 __block 標(biāo)記的時候墩朦,表示在 block 中的修改對于 block 外也是有效地坯认。
具體可參見
https://developer.apple.com/library/ios/documentation/cocoa/Conceptual/Blocks/Articles/bxVariables.[html](http://www.2cto.com/kf/qianduan/css/
這是蘋果官方對于 block 的解釋。
接下來我們看一個例子:
extern NSInteger CounterGlobal;
static NSInteger CounterStatic;
{
NSInteger localCounter = 42;
__block char localCharacter;
void (^aBlock)(void) = ^(void) {
++CounterGlobal;
++CounterStatic;
CounterGlobal = localCounter; // localCounter fixed at block creation
localCharacter = 'a'; // sets localCharacter in enclosing scope
};
++localCounter; // unseen by the block
localCharacter = 'b';
aBlock(); // execute the block
// localCharacter now 'a'
}
在上面的代碼里氓涣,localConter 和 localCharacter 都在 block 中有所修改牛哺,但是在 block 里面,只有 localCharacter 的修改是有效的春哨,原因是 __block 標(biāo)記起了作用荆隘。而在 block 中對于 localCharacter 的修改在 block 外也是可見的。