Block探索

Block

block 類型
**1饰躲、全局block - **NSGlobalBlock****

**2、棧block -NSStackBlock **
**3槽奕、堆block - **NSMallocBlock****
總結(jié)

  • block直接存儲在全局區(qū)

  • 如果block訪問外界變量,并進行block相應拷貝,即copy

  • 如果此時的block是強引用嫉沽,則block存儲在堆區(qū),即堆區(qū)block

  • 如果此時的block通過__weak變成了弱引用俏竞,則block存儲在棧區(qū)绸硕,即棧區(qū)block

    解決block循環(huán)引用的方法 自動釋放 如果block內(nèi)部嵌套block,需要同時使用__weak 和 **strong
    image.jpeg

    雖然**weak,解決了block里面的循環(huán)引用問題魂毁,但是在延遲操作的時候玻佩,保證不了name的生命周期,所以這時候是null席楚,這時候就要結(jié)合__strong 來使用

weak-strong-dance 強弱共舞

手動釋放

image.jpeg

利用臨時變量打破block->self的持有

image.jpeg


利用VC進行通訊
NSProxy 虛擬類
NSProxy 其實是一個消息重定向封裝的一個抽象類咬崔,類似一個代理人,中間件,可以通過繼承它垮斯,并重寫下面兩個方法來實現(xiàn)消息轉(zhuǎn)發(fā)到另一個實例

image.jpeg

循環(huán)引用解決原理
自定義一個NSProxy的子類CJLProxy

block底層分析

image.jpeg


通過xcrun -sdk iphonesimulator clang -arch x86_64 -rewrite-objc block.c郎仆,將block.c 編譯成 block.cpp,其中block在底層被編譯成了以下的形式


image.jpeg

image.jpeg

image.jpeg


這里說明了block必須調(diào)用

訪問外界局部變量


image.jpeg

image.jpeg


這里會造成編譯器代碼歧義兜蠕,只讀

__block修飾后


image.jpeg

image.jpeg

image.jpeg

block的結(jié)構(gòu)

Block_layout

image.jpeg

descriptor1扰肌,通過指針編譯,可以獲取到descriptor2熊杨,copy和dipose在這里
descriptor3曙旭,block的簽名在這里

block變化的流程

image.jpeg

開始是一個全局的block,但是訪問了外部局部變量晶府,變成棧block桂躏,之后在系統(tǒng)內(nèi)部,objc_retainblock里面川陆,系統(tǒng)進行了copy的操作剂习,外部默認是strong修飾的,所以出objc_retainblock的時候较沪,就變成了堆block

_Block_copy

image.jpeg

把參數(shù)轉(zhuǎn)成block_layout類型鳞绕,如果是全局block那么直接返回,再之后只有棧區(qū)block了购对,因為堆區(qū)block是需要申請開辟空間的猾昆,進入棧的判斷,這里進行了malloc申請開辟空間骡苞,進行memmove平移垂蜗,copy變成堆區(qū)block

block的三層copy
1、首先blcok對外部變量的一次copy解幽,到堆區(qū)
2贴见、因為block修飾的外部變量變成了_block_byref的結(jié)構(gòu)體,這一次對這個結(jié)構(gòu)體進行copy
3躲株、如果外部變量是一個對象的話片部,那么就會進行第三次copy,對這個對象進行copy到block內(nèi)部

image.jpeg

blcok對外界變量的捕獲

image.jpeg

image.jpeg


首先判斷對象類型霜定,byref是block修飾后的類型

image.jpeg

image.jpeg

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末档悠,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子望浩,更是在濱河造成了極大的恐慌辖所,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件磨德,死亡現(xiàn)場離奇詭異缘回,居然都是意外死亡吆视,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門酥宴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來啦吧,“玉大人,你說我怎么就攤上這事拙寡∈谧遥” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵倒庵,是天一觀的道長褒墨。 經(jīng)常有香客問我炫刷,道長擎宝,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任浑玛,我火速辦了婚禮绍申,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘顾彰。我一直安慰自己极阅,他們只是感情好,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布涨享。 她就那樣靜靜地躺著筋搏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪厕隧。 梳的紋絲不亂的頭發(fā)上奔脐,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音吁讨,去河邊找鬼髓迎。 笑死,一個胖子當著我的面吹牛建丧,可吹牛的內(nèi)容都是我干的排龄。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼翎朱,長吁一口氣:“原來是場噩夢啊……” “哼橄维!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起拴曲,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤争舞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后疗韵,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體兑障,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了流译。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逞怨。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖福澡,靈堂內(nèi)的尸體忽然破棺而出叠赦,到底是詐尸還是另有隱情,我是刑警寧澤革砸,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布除秀,位于F島的核電站,受9級特大地震影響算利,放射性物質(zhì)發(fā)生泄漏册踩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一效拭、第九天 我趴在偏房一處隱蔽的房頂上張望暂吉。 院中可真熱鬧,春花似錦缎患、人聲如沸慕的。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肮街。三九已至,卻和暖如春判导,著一層夾襖步出監(jiān)牢的瞬間嫉父,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工骡楼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留熔号,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓鸟整,卻偏偏與公主長得像引镊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子篮条,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

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

  • 這里主要介紹block的類型弟头、循環(huán)引用的解決方法以及block底層的分析 block 類型 block主要有三種類...
    恍然如夢_b700閱讀 297評論 0 2
  • Block又稱為代碼塊,匿名函數(shù)涉茧,函數(shù)指針赴恨,下面來詳細介紹Block的相關(guān)內(nèi)容; Block的聲明定義 【第一種:...
    YanZi_33閱讀 440評論 1 1
  • Block的分類 Block一共有6種類伴栓,常見的有三種伦连。 上面這種block的打印結(jié)果為<__NSGlobalBl...
    半邊楓葉閱讀 474評論 0 2
  • block 三種類型 全局block NSGlobalBlock 沒有對外界變量進行捕獲的時候雨饺,它是個函數(shù)的區(qū)域,...
    猿人閱讀 510評論 1 4
  • 本文主要介紹block的類型惑淳、循環(huán)引用的解決方法以及block底層的分析 block 類型 block主要有三種類...
    北京_小海閱讀 599評論 0 2