【iOS面試糧食】Block

本文章將記錄Objective-C中Block的相關(guān)資料件缸,如有錯(cuò)誤歡迎指出~

Block的本質(zhì)

Block本質(zhì).png

Block 實(shí)際上就是一個(gè)OC對象(結(jié)構(gòu)體中有 isa 指針),這個(gè)對象封裝了函數(shù)恰矩,以及函數(shù)執(zhí)行的上下文

Block的變量捕獲

為了保證block內(nèi)部能夠正常訪問外部的變量,block有一個(gè)變量捕獲機(jī)制。block捕獲外部變僅僅只捕獲Block閉包里面會(huì)用到的值否灾,其他用不到的值梭依,它并不會(huì)去捕獲挣柬。

局部變量

看下簡單的代碼輸出

auto int age = 10;
static int num = 25;
void (^Block)(void) = ^{
    NSLog(@"age:%d,num:%d",age,num);
};
age = 20;
num = 11;
Block();

// log   age = 10
                 age = 11
  • auto變量
    • auto自動(dòng)變量,離開作用域就銷毀睛挚,通常局部變量前面自動(dòng)添加auto關(guān)鍵字邪蛔。自動(dòng)變量會(huì)捕獲到block內(nèi)部,也就是說block內(nèi)部會(huì)專門新增加一個(gè)參數(shù)來存儲變量的值扎狱。 auto只存在于局部變量中侧到,訪問方式為值傳遞。
  • static變量
    • static 修飾的變量為指針傳遞淤击,同樣會(huì)被block捕獲匠抗。

為什么兩種變量會(huì)有這種差異呢?

因?yàn)樽詣?dòng)變量可能會(huì)銷毀污抬,block在執(zhí)行的時(shí)候有可能自動(dòng)變量已經(jīng)被銷毀了汞贸,那么此時(shí)如果再去訪問被銷毀的地址肯定會(huì)發(fā)生壞內(nèi)存訪問绳军,因此對于自動(dòng)變量一定是值傳遞而不可能是指針傳遞了。

而靜態(tài)變量不會(huì)被銷毀矢腻,所以完全可以傳遞地址门驾。而因?yàn)閭鬟f的是值得地址,所以在block調(diào)用之前修改地址中保存的值多柑,block中的地址是不會(huì)變得奶是。所以值會(huì)隨之改變。

全局變量

因?yàn)槿肿兞繜o論在哪里都可以訪問竣灌,所以block不需要捕獲全局變量

變量類型

總結(jié):

  • 局部變量都會(huì)被block捕獲聂沙,自動(dòng)變量是值捕獲,靜態(tài)變量為地址捕獲

  • 全局變量則不會(huì)被block捕獲

Block的類型

OC中初嘹,一般Block就分為以下3種類型

  • __NSGlobalBlock__( _NSConcreteGlobalBlock )及汉,即沒有用到外界變量或只用到全局變量、靜態(tài)變量的block屯烦。生命周期從創(chuàng)建到應(yīng)用程序結(jié)束豁生,直到程序結(jié)束才會(huì)被回收,不過我們很少使用到__NSGlobalBlock__類型的block漫贞,因?yàn)檫@樣使用block并沒有什么意義甸箱。
  • __NSStackBlock__( _NSConcreteStackBlock ),即只用到外部局部變量迅脐、成員屬性變量芍殖,且沒有強(qiáng)指針引用的block。__NSStackBlock__類型的block存放在棧中谴蔑,我們知道棧中的內(nèi)存由系統(tǒng)自動(dòng)分配和釋放豌骏,作用域執(zhí)行完畢之后就會(huì)被立即釋放,而在相同的作用域中定義block并且調(diào)用block似乎也多此一舉隐锭。
  • __NSMallocBlock__( _NSConcreteMallocBlock )窃躲,即有強(qiáng)指針引用或copy修飾的成員屬性引用的block 。存放在堆中钦睡,沒有強(qiáng)指針引用即銷毀蒂窒,需要我們自己進(jìn)行內(nèi)存管理。
Block的類型.png

Block的循環(huán)引用

這篇文章講的挺不錯(cuò)的Block 與 self 的那點(diǎn)事(iOS)

面試題

面試題請參考 這篇文章 iOS-Block相關(guān)面試題

參考

iOS底層原理總結(jié) - 探尋block的本質(zhì)(一)

iOS block 捕獲外部變量以及注意點(diǎn)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末荞怒,一起剝皮案震驚了整個(gè)濱河市洒琢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌褐桌,老刑警劉巖衰抑,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異荧嵌,居然都是意外死亡呛踊,警方通過查閱死者的電腦和手機(jī)砾淌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谭网,“玉大人汪厨,你說我怎么就攤上這事◎叩祝” “怎么了骄崩?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵聘鳞,是天一觀的道長薄辅。 經(jīng)常有香客問我,道長抠璃,這世上最難降的妖魔是什么站楚? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮搏嗡,結(jié)果婚禮上窿春,老公的妹妹穿的比我還像新娘。我一直安慰自己采盒,他們只是感情好旧乞,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著磅氨,像睡著了一般尺栖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上烦租,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天延赌,我揣著相機(jī)與錄音,去河邊找鬼叉橱。 笑死挫以,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的窃祝。 我是一名探鬼主播掐松,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼粪小!你這毒婦竟也來了甩栈?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤糕再,失蹤者是張志新(化名)和其女友劉穎量没,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體突想,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡殴蹄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年究抓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片袭灯。...
    茶點(diǎn)故事閱讀 38,809評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡刺下,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出稽荧,到底是詐尸還是另有隱情橘茉,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布姨丈,位于F島的核電站畅卓,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蟋恬。R本人自食惡果不足惜翁潘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望歼争。 院中可真熱鬧拜马,春花似錦、人聲如沸沐绒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽乔遮。三九已至扮超,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間申眼,已是汗流浹背瞒津。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留括尸,地道東北人巷蚪。 一個(gè)月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像濒翻,于是被迫代替她去往敵國和親屁柏。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評論 2 351

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