深入理解block的底層之對象類型的auto變量

上一個博客我們介紹的都是block是基本類型的數(shù)據(jù)變量,這個文章,你將了解block訪問對象類型的auto變量將是什么情況

請看下面的代碼:

ARC環(huán)境下運行

首先上面的代碼我們是非常清楚,當person離開了自己的大括號作用域,它就會釋放!

再請看下面的代碼:

ARC環(huán)境下運行

這種情況請問到斷點前,person會不會釋放?答案:不會釋放,因為block是mallocBlock,它對person是強引用吧,只有等block釋放了,person才有可能釋放!

這時候我們來看一下源碼(前面的博客說了很多次了:xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main.cpp)

c++源碼,

我們定義的是什么類型,捕捉到就是什么類型

從這里我們也可以看出.剛剛為什么沒有釋放,因為block沒有釋放,而person是強指針,block釋放以后person才會釋放.

接下來我們換成MRC情況下,運行剛剛的代碼如下:

MRC環(huán)境下運行

這個是很明顯的,我們?nèi)绻宲erson再MRC情況下不釋放,其實只要block執(zhí)行copy操作就行了,大家可以自己試試

我們再看一種情況如下:

ARC環(huán)境運行

這又是一種情況,這是為什么呢?如有一點懵也是正常哈哈!

這是大家可以自己去看一下c++代碼,我們傳入的person也就變成了弱引用.

重點來了:

接下來我們直接看c++源碼解答原因哈:請看下圖

ARC

大家還記得我們之前看的__main_block_desc_0這個函數(shù)嗎?之前我們看的時候,生成的都是箭頭指的那個,現(xiàn)在新增了紅色框框的那段代碼,也就是新增了2個函數(shù),copy和dispose函數(shù).

我們再看一下copy函數(shù)也就是__main_block_impl_0函數(shù)執(zhí)行什么操作:

根據(jù)箭頭,最終會執(zhí)行_Block_object_assign函數(shù),它傳入的也是person對象.

只要blcok進行copy操作,它就會自動生成copy這個函數(shù),并調(diào)用_Block_object_assign函數(shù),而_Block_object_assign函數(shù)會根據(jù)你傳入的是強指針還是弱指針對對象進行持有還是不持有(重點)

剛剛我們只說了copy函數(shù).還有一個函數(shù)?__Block_object_dispose,很明顯這個函數(shù)是在block釋放的時候會對持有的對象進行釋放,它傳入的也是person,我們可以看下

釋放函數(shù)

好了,上面說了這么多,我們總結一下

總結:

一、當block內(nèi)部訪問了對象類型的auto變量時

1.如果block在棧上,將會不會對auto變量產(chǎn)生強引用

二、如果block被拷貝到堆上

1.會自動調(diào)用block內(nèi)部的copy函數(shù)

2.copy函數(shù)內(nèi)部會調(diào)用_Block_object_assign函數(shù)

3._Block_object_assign函數(shù)會根據(jù)auto變量修飾符(__strong、__weak、__unsafe_unretaines)做出相應的操作,類似retain(形成強引用、弱引用)

三、如果block從堆上移除

1.會調(diào)用block內(nèi)部的dispose函數(shù)

2.dispose函數(shù)內(nèi)部會調(diào)用__Block_object_dispose函數(shù),自動釋放引用的auto變量,類似release

copy函數(shù):棧上block復制到堆上調(diào)用

dispose函數(shù):堆上block被廢棄時調(diào)用

那這里請問下面的這種情況是多久釋放?(用iOS項目運行)

答案是:1秒就會釋放!

接下來博客我會介紹Block的__block,來繼續(xù)探討block

如果覺得我寫得對您有所幫助,請關注我,我會持續(xù)更新??

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

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容