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

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

這種情況請問到斷點前,person會不會釋放?答案:不會釋放,因為block是mallocBlock,它對person是強引用吧,只有等block釋放了,person才有可能釋放!
這時候我們來看一下源碼(前面的博客說了很多次了:xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main.cpp)

我們定義的是什么類型,捕捉到就是什么類型
從這里我們也可以看出.剛剛為什么沒有釋放,因為block沒有釋放,而person是強指針,block釋放以后person才會釋放.
接下來我們換成MRC情況下,運行剛剛的代碼如下:

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

這又是一種情況,這是為什么呢?如有一點懵也是正常哈哈!
這是大家可以自己去看一下c++代碼,我們傳入的person也就變成了弱引用.
重點來了:
接下來我們直接看c++源碼解答原因哈:請看下圖

大家還記得我們之前看的__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,我們可以看下

好了,上面說了這么多,我們總結一下
總結:
一、當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秒就會釋放!