block 原理總結

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容