Block的原理

block的原理是怎樣的?本質(zhì)是什么?

  • 本質(zhì)就是一個封裝了函數(shù)調(diào)用impl.FuncPtr以及函數(shù)調(diào)用環(huán)境函數(shù)需要的參數(shù)的OC對象impl.isa
Block的本質(zhì).jpg
Block的結(jié)構(gòu).jpg
Block的循環(huán)引用.jpg
__block的__forwarding指針.jpg

__block的作用是什么?有什么使用注意點?

  • __block修飾的變量會被包裝成另一種對象,可以用于解決block內(nèi)部無法修改auto變量值的問題,先通過這個對象再通過__forwarding指針就可以訪問到那個變量進行修改

  • 注意內(nèi)存管理的問題,如果修飾的是對象,block拷貝到堆上時,在ARC環(huán)境下會對對象做retain操作,而MRC環(huán)境下則不會。

__block的內(nèi)存管理(釋放).jpg
__block的內(nèi)存管理(引用).jpg
Block捕獲的對象類型的auto變量.jpg
MRC解決循環(huán)引用問題.jpg
Block的變量捕獲.jpg

block的屬性修飾詞為什么是copy?使用block有哪些使用注意?

  • block一旦沒有進行copy操作就不會在堆上,拷貝在堆上是為了控制block的生命周期,進行內(nèi)存管理
  • 使用注意:循環(huán)引用
ARC解決循環(huán)引用問題.jpg

block在修改NSMutableArray,需不需要添加__block?

  • 不需要,NSMutableArray有相應(yīng)的api來修改數(shù)組內(nèi)容,這是直接使用這個變量,而不是修改這個變量,所以不需要__block修飾,
  • __block能不加就盡量不加,加了數(shù)據(jù)結(jié)構(gòu)就變得復雜,會生成一個額外的結(jié)構(gòu)體
Block和__block的內(nèi)存管理.jpg
__block修飾符.jpg
對象類型的__blcok變量的內(nèi)存管理.jpg
對象類型的__blcok變量和auto變量.jpg
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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