在OC中,C語言結構體不能含有__strong修飾符的變量,因爲編譯器不知道什麼時候初始化和廢棄C語言結構體,不能很好的管理內存。
OC的運行時庫能夠準確地把握block從棧複製到堆以及堆上的block被廢棄的時機,所以block結構體中即使含有__strong或者__weak修飾符的變量,也可以恰當地進行初始化和廢棄。
- 在__main_block_desc_0結構體中增加的成員變量進行copy和dispose
- 通過指針賦值給該成員變量的__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複製到堆上,主要有以下幾種情況
- 調用block的copy實例方法
- block作爲函數返回值返回時
- 將block賦值給__strong修飾的id類型的類或block類型成員變量時
在Cocoa框架中含有usingBlock的方法或者GCD中API傳遞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變量存儲域