block 原理總結(jié)

block 對(duì)變量的引用:

  • 局部變量,傳遞的是值,因?yàn)榫植孔兞靠赡茉?block 執(zhí)行之前就被銷毀,所以傳遞的是值
  • 局部靜態(tài)變量,傳遞的是指針
  • 全局靜態(tài)變量,全局變量,不需要傳遞,因?yàn)樵谌謪^(qū),所以在哪里都可以訪問(wèn)的到
  • __block 變量,傳遞的是結(jié)構(gòu)體指針,__block可以修飾局部變量
  • 屬性和實(shí)例變量,傳遞的是 self

存儲(chǔ)位置

在 ARC 下只訪問(wèn)局部變量的 block 會(huì)放在棧上,但是 ARC會(huì)在以下情況下自動(dòng) copy 到堆上
1、block 作為函數(shù)返回值時(shí)
2、block 用 strong 修飾時(shí),ARC 對(duì)象默認(rèn)修飾符為 strong
3、block作為Cocoa API中方法名含有usingBlock的方法參數(shù)時(shí)
4、作為GCD API的方法參數(shù)時(shí)

要點(diǎn)

  • 沒(méi)有訪問(wèn)局部變量的 block 會(huì)放在全局區(qū)

  • 不能把堆上的 block 拷貝到棧上,可以把堆上的 block 移至 全局區(qū)

  • 引用全局變量、全局靜態(tài)變量、局部靜態(tài)變量:Block 在全局區(qū),屬于 GlobalBlock

  • 引用普通外部變量,用 copy,strong 修飾的 Block 就存放在堆區(qū),屬于 MallocBlock;用 weak 修飾的Block 存放在棧區(qū),屬于 StackBlock

block 塊引用對(duì)象時(shí),copy函數(shù)會(huì)將person地址傳入_Block_object_assign函數(shù),_Block_object_assign中對(duì)Person對(duì)象進(jìn)行強(qiáng)引用或者弱引用
無(wú)論如何block內(nèi)部中對(duì)__block修飾變量生成的結(jié)構(gòu)體都是強(qiáng)引用,結(jié)構(gòu)體內(nèi)部對(duì)外部變量的引用取決于傳入block內(nèi)部的變量是強(qiáng)引用還是弱引用
http://www.cocoachina.com/ios/20180628/23965.html
http://www.cocoachina.com/ios/20180628/23968.html

最后編輯于
?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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