[iOS開發]推翻錯誤結論——“Block可以捕獲它的聲明所在相同作用域的狀態。”

最近看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

183223845.png

  • Can capture state from the lexical scope within which it is defined

(Block)可以捕獲它的定義所在相同作用域的狀態。

沉冤昭雪……


爲什麼網上會統一口徑說捕獲的是聲明所在相同作用域呢?

順藤摸瓜發現網上有人將這份關於block的蘋果官方文檔翻譯成了中文…

翻譯的還挺好的,就是這一句翻譯錯了……錯將定義翻譯成了聲明(或者是不小心,或者是聲明和定義概念沒有搞清楚)

一傳十十傳百,關於block的諸多資料都是由這份錯誤翻譯的文檔演變而來的…

悲傷的是到現在還沒有人來爲其正名…

百度關於Block捕獲的是何時的作用域清一色的全是錯誤結論……

184921693.png

坑爹呢這是!!


正確結論:

Block捕獲的應該是它的定義所在相同作用域的狀態。而不是所謂的聲明所在相同域的狀態。

大家對於網上的資料不要盲信,一要自己去試,二要警惕翻譯錯誤挖的坑。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章