又見block(七):截獲對象

OC中,C語言結構體不能含有__strong修飾符的變量,因爲編譯器不知道什麼時候初始化和廢棄C語言結構體,不能很好的管理內存。

OC的運行時庫能夠準確地把握block從棧複製到堆以及堆上的block被廢棄的時機,所以block結構體中即使含有__strong或者__weak修飾符的變量,也可以恰當地進行初始化和廢棄。

  • __main_block_desc_0結構體中增加的成員變量進行copydispose
  • 通過指針賦值給該成員變量的__main_block_copy_0函數和__main_block_dispose_0函數
    __main_block_copy_0函數:使用_block_object_assign函數將對象類型的對象賦值給block結構體中的成員變量,相當於retain實例方法
    __main_block_dispose_0函數:使用_block_object_dispose函數釋放賦值在block結構體中的成員變量,相當於release實例方法

__main_block_copy_0__main_block_dispose_0的調用時機如下:

函數 調用時機
__main_block_copy_0 棧上的block複製到堆上時
__main_block_dispose_0 堆上的block被廢棄時

棧上的block複製到堆上,主要有以下幾種情況

  • 調用blockcopy實例方法
  • block作爲函數返回值返回時
  • block賦值給__strong修飾的id類型的類或block類型成員變量時
  • Cocoa框架中含有usingBlock的方法或者GCDAPI傳遞block

    block在截獲對象時和使用__block變量時的不同

截獲的是對象 BLOCK_FIELD_IS_OBJECT
截獲的是__block變量 BLOCK_FIELD_IS_BYREF

可以通過這2個不同的參數來區分__main_block_copy_0函數和__main_block_dispose_0函數的對象類型是對象還是__block變量。

block中使用的賦值給__strong修飾符的自動變量的對象和複製到堆上的__block變量由於被堆上的block所持有,所以可以超出其變量作用域而存在

又見block(一):block是什麼?
又見block(二):block語法定義
又見block(三):block實質
又見block(四):block捕獲自動變量
又見block(五): __block變量和對象
又見block(六):block存儲域與__block變量存儲域

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章