底層原理(四)------Block

1、block的本質(zhì)

1、block本質(zhì)上也是一個OC對象,它內(nèi)部也有個isa指針。
2、block是封裝了函數(shù)調(diào)用以及函數(shù)調(diào)用環(huán)境的OC對象


image.png

image.png

image.png

3、auto變量的捕捉(auto 自動變量,離開作用域就銷毀)


image.png

4、block的變量捕獲(capture)
image.png

注:局部變量為啥需要捕獲到block內(nèi)部,因為他需要跨函數(shù)進(jìn)行操作,全局變量不需要,可以任意操作
self是參數(shù),也就是局部變量 可以捕獲到block內(nèi)部。默認(rèn)傳遞2個參數(shù)(MJPerson *self, SEL _cmd)
OC里面的方法前面2個參數(shù)都是方法調(diào)用者跟方法名

2、Block的類型

1、block有3種類型,可以通過調(diào)用class方法或isa指針查看具體類型,最終類型都是繼承自 NSBlock類型


image.png

3種block在內(nèi)存中的分布

堆:動態(tài)分配內(nèi)存,需要程序員申請內(nèi)存,也需要程序員管理內(nèi)存
棧:放一些局部變量,系統(tǒng)會自動分配內(nèi)存,也會自動銷毀內(nèi)存


  • GlobalBlock:


    GlobalBlock
  • StackBlock:


    StackBlock

為啥打印不是StackBlock 而是MallocBlock,是因為是ARC環(huán)境下
在ARC環(huán)境下,編譯器會根據(jù)情況自動將棧上的block復(fù)制到堆上
1.block作為函數(shù)返回值(Masonry框架運用大量這種)
2.將block賦值給__strong指針時
3.block作為Cocoa API中方法名含有usingBlock的方法參數(shù)時
4.block作為GCD API的方法參數(shù)時

三、對象類型的auto變量

四、__block修飾符

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


六、對象類型的auto變量、__block變量

七、__block的__forwarding指針

八、被__block修飾的對象類型

九、循環(huán)引用


十、解決循環(huán)引用---ARC環(huán)境下

// __weak:不會產(chǎn)生強(qiáng)引用,指向的對象銷毀時,會自動讓指針置為nil
// __unsafe_unretained:不會產(chǎn)生強(qiáng)引用,不安全,指向?qū)ο箐N毀時,指針存儲的地址值不變

十一、解決循環(huán)引用---MRC環(huán)境下

MRC下不支持__weak的

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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