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