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