Block的本質(zhì)
- block本質(zhì)上也是一個(gè)OC對(duì)象,它內(nèi)部也有個(gè)isa指針
- block是封裝了函數(shù)調(diào)用以及函數(shù)調(diào)用環(huán)境的OC對(duì)象
-
block的底層結(jié)構(gòu)如右圖所示
image.png
Block的類型
block有3種類型憎妙,可以通過調(diào)用class方法或者isa指針查看具體類型仪搔,最終都是繼承自NSBlock類型
- NSGlobalBlock ( _NSConcreteGlobalBlock )
- NSStackBlock ( _NSConcreteStackBlock )
- NSMallocBlock ( _NSConcreteMallocBlock )
image.png
image.png
ARC:2022-01-10 11:00:35.296362+0800 BlockTest[413:16792] 0 type globalBlock:NSGlobalBlock stackGlobal:NSMallocBlock mallocBlock:NSGlobalBlock
2022-01-10 11:00:35.296469+0800 BlockTest[413:16792] 1 type globalBlock:NSGlobalBlock stackGlobal:NSMallocBlock mallocBlock:NSMallocBlock
MRC:2022-01-10 11:06:08.031263+0800 BlockTest[428:18568] 0 type globalBlock:NSGlobalBlock stackGlobal:NSStackBlock mallocBlock:NSGlobalBlock
2022-01-10 11:06:08.031406+0800 BlockTest[428:18568] 1 type globalBlock:NSGlobalBlock stackGlobal:NSStackBlock mallocBlock:NSMallocBlock
Block的變量捕獲
為了保證block內(nèi)部能夠正常訪問外部的變量革屠,block有個(gè)變量捕獲機(jī)制
image.png
image.png
2022-01-10 14:15:19.730962+0800 BlockTest[474:45513] 0 staticGlobalValue:1, globalValue:2 staticValue:3 localValue:4
2022-01-10 14:15:19.730999+0800 BlockTest[474:45513] 1 staticGlobalValue:2, globalValue:3 staticValue:4 localValue:4
image.png
__block修飾符
__block可以用于解決block內(nèi)部無法修改auto變量值的問題
__block不能修飾全局變量沛膳、靜態(tài)變量(static)
編譯器會(huì)將__block變量包裝成一個(gè)對(duì)象
image.png
image.png
image.png
image.png
__block的__forwarding指針
image.png
image.png
image.png
image.png