OC底層基礎(chǔ):Block

查看oc文件底層結(jié)構(gòu)

xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc xxx.m

支持ARC、指定運(yùn)行時(shí)系統(tǒng)版本

xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc -fobjc-arc -fobjc-runtime=ios-15.0.0 xxx.m

一、__block修飾符

1. __block可以用于解決block內(nèi)部無法修改auto變量值的問題

2. __block不能修飾全局變量、靜態(tài)變量(static

3. 編譯器會(huì)將__block變量包裝成一個(gè)對(duì)象

__block.png

__block方法.png
__block結(jié)構(gòu)體1.png
__block結(jié)構(gòu)體2.png

二、__block的__forwarding指針

__forwarding指針.png

三、對(duì)象類型的auto變量、__block變量

1. 當(dāng)block在棧上時(shí),對(duì)他們都不會(huì)產(chǎn)生強(qiáng)引用

2. 當(dāng)block被copy在堆上時(shí),都會(huì)通過copy函數(shù)來處理他們

  • __block變量(假設(shè)變量名叫做a

    1. _Block_object_assign((void*)&dst->a, (void*)src->a, 8/*BLOCK_FIELD_IS_BYREF*/
  • 對(duì)象類型的auto變量(假設(shè)變量名叫做p

    1. _Block_object_assign((void*)&dst->p, (void*)src->p, 3/*BLOCK_FIELD_IS_OBJECT*/

3. 當(dāng)block從堆上移除時(shí),都會(huì)通過dispose函數(shù)來釋放它們

  • __block變量(假設(shè)變量名叫做a

    1. _Block_object_dispose((void*)&dst->a, 8/*BLOCK_FIELD_IS_BYREF*/
  • 對(duì)象類型的auto變量(假設(shè)變量名叫做p

    1. _Block_object_dispose((void*)&dst->p, 3/*BLOCK_FIELD_IS_OBJECT*/
      __block變量.png

      對(duì)象類型的auto變量.png

四、__block的內(nèi)存管理

1. 當(dāng)__block變量在棧上時(shí),不會(huì)對(duì)指向的對(duì)象產(chǎn)生強(qiáng)引用

2. 當(dāng)__block變量被copy到堆時(shí)

  • 會(huì)調(diào)用__block變量?jī)?nèi)部的copy函數(shù)
  • copy函數(shù)內(nèi)部會(huì)調(diào)用_Block_object_assign函數(shù)
  • _Block_object_assign函數(shù)會(huì)根據(jù)所指向?qū)ο蟮男揎椃?code>__strong、__weak、__unsafe_unretained)作出相應(yīng)的操作,形成強(qiáng)引用(retain)或者弱引用(注意:這里僅限于ARC時(shí)會(huì)retain,MRC時(shí)不會(huì)retain
    block變量被copy到堆.png

3. 如果__block變量從堆上刪除

  • 會(huì)調(diào)用__block變量?jī)?nèi)部的dispose函數(shù)
  • dispose函數(shù)內(nèi)部會(huì)調(diào)用_Block_object_ dispose函數(shù)
  • _Block_object_ dispose函數(shù)會(huì)自動(dòng)釋放指向的對(duì)象(release
    block變量從堆上刪除.png

注:可能涉及的面試題

  • block原理是怎么樣的?本質(zhì)是什么?
    • 封裝了函數(shù)調(diào)用以及調(diào)用環(huán)境的OC對(duì)象
  • __block的作用是什么?有什么使用注意點(diǎn)?
  • block的屬性修飾詞為什么是copy?使block有哪些使用注意
    • block一旦沒有進(jìn)行copy操作,就不會(huì)在堆上
    • 使用注意:循環(huán)引用
  • block在修飾NSMutableArray時(shí)需不需要添加__block

上一篇:
OC底層基礎(chǔ):性能優(yōu)化
下一篇:
OC底層基礎(chǔ):RunLoop

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容