{Ws看官網(wǎng)文檔}Block-變量傳遞(二)


  • 寫在前面: 翻翻各個(gè)iOS大牛的博客,或者在他們回答新手如何學(xué)習(xí)iOS開發(fā)時(shí),"多看,一定要看蘋果官方文檔"這句話100%會(huì)出現(xiàn)."蘋果人家是權(quán)威,多少博客都是翻譯一遍罷了""不要啃人家嚼過的甘蔗".理都懂,然并卵.就結(jié)合自己情況來說,之前也看的不多原因有三:
  • 1.中文看著多舒服,人忙忙的,問題解決就ok,想那多干啥
  • 2.臥槽,密密麻麻這是啥,看兩行嚇得我電腦都關(guān)上了
  • 3.問問自己的定位,你是不是一位合格并且有上進(jìn)心的開發(fā)者?

其實(shí)對于大多數(shù)開發(fā)者來說,入了門之后,耳濡目染的都會(huì)寫,認(rèn)識(shí)些英文,所以其實(shí)還是一個(gè)懶,這句話也在說自己. 時(shí)光恍恍惚惚時(shí)間就這么沒了,maybe失去些東西會(huì)讓人突然安靜下來.學(xué)習(xí)iOS一直自己做筆記,翻了翻自己的筆記,有些概念模模糊糊模棱兩可,覺得是時(shí)候總結(jié)一波了.不想做咸魚的我也就在這時(shí)候靜下心來,看了一晚上蘋果官網(wǎng)文檔,對,是一晚上.不會(huì)的單詞右擊Look up, 復(fù)雜些的google.很惡心自己英文下降很多,但是觀后感是:臥槽,這玩意才是武功秘籍好伐, 不管是guide還是一些api說明,實(shí)例code,絕逼權(quán)威,個(gè)人也覺得不會(huì)比一些中博客"翻譯"過來的難理解. 一晚上,"soga...原來是這樣!""這個(gè)這么理解才對""媽蛋,吃了這么久的二手甘蔗",是我整個(gè)心理活動(dòng).
當(dāng)然夸張了, 只是覺得一是靜下心來認(rèn)真那種感覺很難得,二是官方文檔真的很好.

這個(gè)集我想著自己盡量多的總結(jié)下官方文檔的原文內(nèi)容(不會(huì)大段落的翻譯),帶著自己(如果能幫到你就更好啦), 咱們?nèi)コ砸皇重?!


英文全部來自官方文檔iOS9.1Document ,如果有錯(cuò)誤,可能是復(fù)制或者打字錯(cuò)誤, 開局了:

    1. Blocks Can Capture Values from the Enclosing Scope

(先別急著翻譯,看下下面的這兩個(gè)方法,猜下輸出先.)
As well as containing executable code, a block also has the ability to capture state from its enclosing scope.
If you declare a block literal from within a method, for example, it’s possible to capture any of the values accessible within the scope of that method, like this:

- (void)testMethod {
    int anInteger = 42;
 
    void (^testBlock)(void) = ^{
        NSLog(@"Integer is: %i", anInteger);
    };
 
    testBlock();
}

In this example, anInteger is declared outside of the block, but the value is captured when the block is defined.

Only the value is captured, unless you specify otherwise. This means that if you change the external value of the variable between the time you define the block and the time it’s invoked, like this:

int anInteger = 42;

void (^testBlock)(void) = ^{
    NSLog(@"Integer is: %i", anInteger);
};

anInteger = 84;

testBlock();

the value captured by the block is unaffected. This means that the log output would still show:

Integer is: 42      //輸出是42```
It also means that the block cannot change the value of the original variable, or even the captured value (it’s captured as a const variable).
```objc
這里來總結(jié)文檔意思: 不僅可以包含可執(zhí)行代碼一樣,block能力超群,可以從封閉范圍內(nèi)獲取值. 
其實(shí)道理很簡單,答案應(yīng)該有2種: 42 ,84 
42是覺得,可以的,不過這里是值傳遞
84覺得,外面修改了,我里面也用了,有可能吧.

隨后文檔給了解釋: 除非你特殊定義,不然這個(gè)局部變量存在Block中后,后面你修改,它內(nèi)部value是不影響的.
就像const來修飾一個(gè)變量,讓它只讀!

問題來了,那么怎樣叫特殊定義,怎樣可以修改? 來接下來就有解釋了.
  1. Use __block Variables to Share Storage(這個(gè)標(biāo)題自己翻譯下)

If you need to be able to change the value of a captured variable from within a block, you can use the __block storage type modifier on the original variable declaration. This means that the variable lives in storage that is shared between the lexical scope of the original variable and any blocks declared within that scope.

As an example, you might rewrite the previous example like this:

__block int anInteger = 42;

void (^testBlock)(void) = ^{
    NSLog(@"Integer is: %i", anInteger);
};

anInteger = 84;

testBlock();

Because anInteger is declared as a __block variable, its storage is shared with the block declaration. This means that the log output would now show:

Integer is: 84   //這里輸出就成84了
也就是說,用__block修飾變量,外部修改了這個(gè)變量,那么block里用得時(shí)候,就得注意了,值就變了.
用歪果仁的原文就是,Because anInteger is declared as a __block variable,
its storage is shared with the block declaration,分享給了你,這思維咋翻譯嘛....
也就可以理解為,指針傳遞,帶了__block這個(gè)修飾變量,外面修改,里面也會(huì)改

It also means that the block can modify the original value, like this:
(在看看這個(gè):)

__block int anInteger = 42;

  void (^testBlock)(void) = ^{
      NSLog(@"Integer is: %i", anInteger);
      anInteger = 100;
  };

  testBlock();
  NSLog(@"Value of original variable is now: %i", anInteger);
This time, the output would show:

輸出分別是:
Integer is: 42
Value of original variable is now: 100

  • 也就意味者,外部修改變量,會(huì)影響block調(diào)用時(shí)它的值,同時(shí)block內(nèi)部也可以修改,有執(zhí)行順序,猜猜那么下段怎么輸出.
- (void)text {
    
    __block int a = 10;
    
    void(^block)() = ^void() {
        a = 20;   //先修改a
        NSLog(@"a = %d",a);
        
    };
    
    block();
    
    NSLog(@" new a = %d",a);
    
}

//沒錯(cuò),內(nèi)部是按順序執(zhí)行的,   a = 20   ,new a = 20
  • 我也很疑惑,為什么加上_ block就可以了,是不是變量作用域的問題. 那么我就不加 _block,而是把a(bǔ)修飾成全局的試試? 加上static是什么效果? 自己去試試吧,下面是結(jié)果.
int a = 10;

- (void)text {
    
    
    void(^block)() = ^void() {
        a = 30;
        NSLog(@"%d",a);
        
    };
        a = 20;
    
    block();
    
    NSLog(@" new a = %d",a); 
  /* 輸出a = 30; new a = 30; 所以執(zhí)行順序就明白了:
     先到a = 20; 然后進(jìn)block
  */
--------------------------------------------
- (void)text2 {
    
    static int a = 5;
    void(^block)() = ^void() {
        
        NSLog(@"%d",a);
        
    };
    a = 20;
    
    block();
    
    NSLog(@" new a = %d",a);
      /* 輸出a = 20; new a = 20; 所以執(zhí)行順序就明白了:
     先到a = 20; 然后進(jìn)block
  */
------------------------------
- (void)text3 {
    
    static int a = 5;
    void(^block)() = ^void() {
        a = 30;
        NSLog(@"%d",a);
        
    };
    a = 20;
    
    block();
    
    NSLog(@" new a = %d",a);
    //輸出 a = 30;  new a = 30;
}

所以蘋果這里說__block的意義在于,1. 在一個(gè)函數(shù)中,它不僅可以保存代碼塊
更是可以跳出那個(gè){},獲取外面的值  2.加上__block后,更是在block塊兒內(nèi)獲取外面值得時(shí)候,先修改,再存入,
同時(shí)block內(nèi)可以修改這個(gè)變量值,這里思想就不會(huì)禁錮在變量的作用域上.而是說Block的特性
所以不糾結(jié)其他的,總結(jié)block下就是兩種傳遞:
1.值傳遞
2.指針傳遞.  為啥這么叫,用clang再編譯下,然后查找對應(yīng)傳遞,就會(huì)明白啦! 
不加__block,傳的是值
加上__block,是指針
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末纳本,一起剝皮案震驚了整個(gè)濱河市禾怠,隨后出現(xiàn)的幾起案子海铆,更是在濱河造成了極大的恐慌系忙,老刑警劉巖叁鉴,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡硼啤,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門横堡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來埋市,“玉大人,你說我怎么就攤上這事命贴〉勒” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵胸蛛,是天一觀的道長污茵。 經(jīng)常有香客問我,道長葬项,這世上最難降的妖魔是什么泞当? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮民珍,結(jié)果婚禮上襟士,老公的妹妹穿的比我還像新娘。我一直安慰自己嚷量,他們只是感情好陋桂,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蝶溶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上债蜜,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天祖秒,我揣著相機(jī)與錄音,去河邊找鬼部蛇。 笑死摊唇,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的涯鲁。 我是一名探鬼主播巷查,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼抹腿!你這毒婦竟也來了岛请?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤警绩,失蹤者是張志新(化名)和其女友劉穎崇败,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡后室,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年缩膝,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片岸霹。...
    茶點(diǎn)故事閱讀 38,650評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡疾层,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出贡避,到底是詐尸還是另有隱情痛黎,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布刮吧,位于F島的核電站湖饱,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏杀捻。R本人自食惡果不足惜井厌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望致讥。 院中可真熱鬧旗笔,春花似錦、人聲如沸拄踪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽惶桐。三九已至撮弧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間姚糊,已是汗流浹背贿衍。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留救恨,地道東北人贸辈。 一個(gè)月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像肠槽,于是被迫代替她去往敵國和親擎淤。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容

  • **2014真題Directions:Read the following text. Choose the be...
    又是夜半驚坐起閱讀 9,437評論 0 23
  • 我覺得所謂的結(jié)束秸仙,不過是暫時(shí)告一段落嘴拢,并無太大意義,就如同活著一樣寂纪。并非因?yàn)橛辛私Y(jié)束席吴,過程才有意義赌结,而是為了便宜的...
    愛斯基摩人we閱讀 845評論 0 0
  • 人在一定的年齡段會(huì)有一定的變化,等你過了那個(gè)年齡段孝冒,就會(huì)覺得自己以前多么可笑
    HANZIQIANG閱讀 48評論 0 1
  • 愿你三冬暖庄涡,愿你春不寒伤靠; 愿你天黑有燈,下雨有傘啼染; 愿你一路上,有良人陪伴焕梅; 愿你翻山越嶺都有人想念迹鹅; 愿你一路風(fēng)...
    灰兮閱讀 260評論 0 0
  • 這個(gè)系列的文章是我最想寫的東西之一,卻也是最不會(huì)寫的東西贞言。創(chuàng)作它的想法萌發(fā)于某次國際處值班斜棚,無聊的我刷知乎刷到了田...
    冰鎮(zhèn)冰水閱讀 457評論 0 1