block 對(duì)變量的引用:
- 局部變量,傳遞的是值,因?yàn)榫植孔兞靠赡茉?block 執(zhí)行之前就被銷毀,所以傳遞的是值
- 局部靜態(tài)變量,傳遞的是指針
- 全局靜態(tài)變量,全局變量,不需要傳遞,因?yàn)樵谌謪^(qū),所以在哪里都可以訪問(wèn)的到
- __block 變量,傳遞的是結(jié)構(gòu)體指針,__block可以修飾局部變量
- 屬性和實(shí)例變量,傳遞的是 self
存儲(chǔ)位置
在 ARC 下只訪問(wèn)局部變量的 block 會(huì)放在棧上,但是 ARC會(huì)在以下情況下自動(dòng) copy 到堆上
1、block 作為函數(shù)返回值時(shí)
2、block 用 strong 修飾時(shí),ARC 對(duì)象默認(rèn)修飾符為 strong
3、block作為Cocoa API中方法名含有usingBlock的方法參數(shù)時(shí)
4、作為GCD API的方法參數(shù)時(shí)
要點(diǎn)
沒(méi)有訪問(wèn)局部變量的 block 會(huì)放在全局區(qū)
不能把堆上的 block 拷貝到棧上,可以把堆上的 block 移至 全局區(qū)
引用全局變量、全局靜態(tài)變量、局部靜態(tài)變量:Block 在全局區(qū),屬于 GlobalBlock
引用普通外部變量,用 copy,strong 修飾的 Block 就存放在堆區(qū),屬于 MallocBlock;用 weak 修飾的Block 存放在棧區(qū),屬于 StackBlock
block 塊引用對(duì)象時(shí),copy函數(shù)會(huì)將person地址傳入_Block_object_assign函數(shù),_Block_object_assign中對(duì)Person對(duì)象進(jìn)行強(qiáng)引用或者弱引用
無(wú)論如何block內(nèi)部中對(duì)__block修飾變量生成的結(jié)構(gòu)體都是強(qiáng)引用,結(jié)構(gòu)體內(nèi)部對(duì)外部變量的引用取決于傳入block內(nèi)部的變量是強(qiáng)引用還是弱引用
http://www.cocoachina.com/ios/20180628/23965.html
http://www.cocoachina.com/ios/20180628/23968.html