1、block的本質(zhì)
1、block本質(zhì)上也是一個OC對象,它內(nèi)部也有個isa指針。
2、block是封裝了函數(shù)調(diào)用以及函數(shù)調(diào)用環(huán)境的OC對象
3、auto變量的捕捉(auto 自動變量,離開作用域就銷毀)
4、block的變量捕獲(capture)
注:局部變量為啥需要捕獲到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類型
堆:動態(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的