這段代碼到底會(huì)不會(huì)奔潰

以前看書(shū)的時(shí)候剖效,書(shū)上說(shuō)什么那就是什么独郎,雖然可能不太理解浦箱,但還是會(huì)給它定義一個(gè)「正確」的標(biāo)準(zhǔn)。但是這樣會(huì)很沒(méi)有意思惑芭,就像是被別人牽著鼻子走似得。如果抱著懷疑的態(tài)度去看待继找,可能會(huì)有意思很多遂跟,而且還能學(xué)到印象深刻的東西。

比如像下面這段代碼會(huì)不會(huì)奔潰的問(wèn)題:

    void (^block)();
    BOOL condition = /*YES or NO*/;
    if (condition) {
        block = ^{
            NSLog(@"Block A");
        };
    } else {
        block = ^{
            NSLog(@"Block B");
        };
    }
    
    block();

官方的解釋是:定義在 if 及 else 語(yǔ)句中的兩個(gè)塊都分配在棧內(nèi)存中婴渡。編譯器會(huì)給每一個(gè)塊分配好內(nèi)存幻锁,然而等離開(kāi)了響應(yīng)的范圍之后,編譯器就有可能把分配的塊給覆寫(xiě)掉边臼。所以執(zhí)行結(jié)果是有時(shí)會(huì)奔潰哄尔,有時(shí)不會(huì)奔潰。

疑惑點(diǎn):

  1. 條件語(yǔ)句中的 Block 賦值給 block 變量硼瓣,而 block 變量是在條件語(yǔ)句之外的究飞,怎么可能會(huì)在 if 語(yǔ)句結(jié)束的時(shí)候就被銷(xiāo)毀呢?
  2. 這個(gè) block 是分配在棧上么堂鲤?

且來(lái)調(diào)試一番亿傅,我們?cè)?block() 處下一個(gè)斷點(diǎn),請(qǐng)看:

__NSGlobalBlock__.png

咦瘟栖?是 __NSGlobalBlock__ 類(lèi)型的, 好像被騙了葵擎!全局類(lèi)型的 Block 分配在全局內(nèi)存區(qū)域,會(huì)存在于應(yīng)用程序的整個(gè)生命周期半哟,是不會(huì)被釋放的酬滤。

再來(lái)看一個(gè)例子:

    void (^block)();
    int i = 0;
    BOOL condition = /*YES or NO*/;
    if (condition) {
        block = ^{
            NSLog(@"Block A %d", i);
        };
    } else {
        block = ^{
            NSLog(@"Block B %d", i);
        };
    }
    
    block();

同樣斷點(diǎn)調(diào)試一下:


__NSMallocBlock__.png

什么鬼签餐?又變成 __NSMallocBlock__ 類(lèi)型了。這里只是讓 Block 捕獲了一個(gè)局部變量 i 怎么就分配到堆內(nèi)存上去了呢盯串?

我們來(lái)進(jìn)一步分析一下氯檐,單獨(dú)打印這么一段代碼:

NSLog(@"%@", [^{NSLog(@"Block A %d", i);} class]);

結(jié)果是:

__NSStackBlock__

有沒(méi)有「全家福」的趕腳体捏?以上類(lèi)型湊齊了 Block 上層可見(jiàn)的三種類(lèi)型冠摄。

現(xiàn)在我們可以來(lái)解釋一下,這三種類(lèi)型是如何演變的几缭。

    block = ^{ NSLog(@"Block A");};

上述代碼在 Block 沒(méi)有捕獲外部變量的時(shí)候河泳,默認(rèn)是全局類(lèi)型的,而當(dāng)捕獲分配在棧上的局部變量 i 時(shí)年栓,為了照顧 i 的作用域拆挥,就把自己變?yōu)榱藯n?lèi)型。

而從棧類(lèi)型到堆類(lèi)型是因?yàn)閳?zhí)行如下賦值操作某抓,Block 默認(rèn)會(huì)進(jìn)行一次 copy 操作纸兔,把棧上(等式右邊)的 Block 復(fù)制到堆。

  block = ^{ NSLog(@"Block B %d", i);};

所以我認(rèn)為正確的答應(yīng)是:永遠(yuǎn)不會(huì)奔潰否副。

當(dāng)然我們討論的以上情況是在 ARC 環(huán)境下食拜。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市副编,隨后出現(xiàn)的幾起案子负甸,更是在濱河造成了極大的恐慌,老刑警劉巖痹届,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件呻待,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡队腐,警方通過(guò)查閱死者的電腦和手機(jī)蚕捉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)柴淘,“玉大人迫淹,你說(shuō)我怎么就攤上這事∥希” “怎么了敛熬?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)第股。 經(jīng)常有香客問(wèn)我应民,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任诲锹,我火速辦了婚禮繁仁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘归园。我一直安慰自己黄虱,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布庸诱。 她就那樣靜靜地躺著悬钳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪偶翅。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,301評(píng)論 1 301
  • 那天碉渡,我揣著相機(jī)與錄音聚谁,去河邊找鬼。 笑死滞诺,一個(gè)胖子當(dāng)著我的面吹牛形导,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播习霹,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼朵耕,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了淋叶?” 一聲冷哼從身側(cè)響起阎曹,我...
    開(kāi)封第一講書(shū)人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎煞檩,沒(méi)想到半個(gè)月后处嫌,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡斟湃,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年熏迹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凝赛。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡注暗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出墓猎,到底是詐尸還是另有隱情捆昏,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布毙沾,位于F島的核電站屡立,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜膨俐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一勇皇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧焚刺,春花似錦敛摘、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至蔓姚,卻和暖如春捕虽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背坡脐。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工泄私, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人备闲。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓晌端,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親恬砂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子咧纠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

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

  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司泻骤,掛了不少漆羔,但最終還是拿到小米、百度狱掂、阿里钧椰、京東、新浪符欠、CVTE嫡霞、樂(lè)視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,246評(píng)論 11 349
  • 《Objective-C高級(jí)編程》這本書(shū)就講了三個(gè)東西:自動(dòng)引用計(jì)數(shù)、block希柿、GCD诊沪,偏向于從原理上對(duì)這些內(nèi)容...
    WeiHing閱讀 9,810評(píng)論 10 69
  • *面試心聲:其實(shí)這些題本人都沒(méi)怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來(lái)就是把...
    Dove_iOS閱讀 27,139評(píng)論 30 470
  • 一場(chǎng)雨,將秋天分成兩半曾撤,一半用來(lái)懷念端姚,一半用來(lái)感傷。 似乎一點(diǎn)鋪墊都沒(méi)有挤悉,秋就涼了渐裸,涼得突兀,涼得快捷而無(wú)聲無(wú)息。...
    鷹鷹兒閱讀 431評(píng)論 0 8
  • 今日天氣睛好阅嘶,在相公莊村見(jiàn)兩個(gè)婦女蹲在鋪設(shè)地膜的田里勞作。走近一看载迄,原來(lái)她們?cè)跒樵苑N在地膜下的紫甘藍(lán)開(kāi)窗透氣讯柔。大嫂...
    邯鄲李治山閱讀 669評(píng)論 1 3