您好,登錄后才能下訂單哦!
最近看block,覺著好神奇。
尤其是block可以捕獲自動變量值特性,簡直是大殺器啊。
那么捕獲的究竟是何時的自動變量呢?
各大技術博客與技術書籍統一口徑:Block可以捕獲它的聲明所在相同作用域的狀態。
真的是這樣嗎?
且跟我來試一試。
代碼:
- (void)viewDidLoad
{
int val=0;
void (^blk)(NSInteger); //聲明block類型變量
val = 1; //在定義前重新賦值。
blk=^(NSInteger a){
NSLog(@"截獲的val:%d",val);
return;
};
val = 2; //定義后,調用前重新賦值。
blk(val);
}
聲明前val=0;
聲明后定義前val=1;
定義后調用前val=2;
打印出來的結果是什么呢??
2013-12-27 18:30:14.182 Test[2594:70b] 截獲的val:1
所以得出結論:
Block可以捕獲它的定義所在相同作用域的狀態。而不是所謂的聲明所在相同域的狀態。
查閱蘋果官方文檔。
https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Blocks/Articles/bxOverview.html#//apple_ref/doc/uid/TP40007502-CH3-SW3
Can capture state from the lexical scope within which it is defined
(Block)可以捕獲它的定義所在相同作用域的狀態。
沉冤昭雪……
為什么網上會統一口徑說捕獲的是聲明所在相同作用域呢?
順藤摸瓜發現網上有人將這份關于block的蘋果官方文檔翻譯成了中文…
翻譯的還挺好的,就是這一句翻譯錯了……錯將定義翻譯成了聲明(或者是不小心,或者是聲明和定義概念沒有搞清楚)
一傳十十傳百,關于block的諸多資料都是由這份錯誤翻譯的文檔演變而來的…
悲傷的是到現在還沒有人來為其正名…
百度關于Block捕獲的是何時的作用域清一色的全是錯誤結論……
坑爹呢這是!!
正確結論:
Block捕獲的應該是它的定義所在相同作用域的狀態。而不是所謂的聲明所在相同域的狀態。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。