1. 程式人生 > >ARC中的block

ARC中的block

在arc之後,block變得更加簡單了。

只有global和heap block了,原來的stack block沒有了。


從log裡面清楚的看到,原來非arc的stack block變成了mallocblock,也就是常說的堆block。

然後我們看看car物件的釋放:


很清楚car的dealloc的呼叫是在Block2釋放以後。那麼也就是說,我們在Block2=Block1這個地方,car被arc引用計數+1了,相當於car的生命週期延長到了block2物件了。所以,只有block2釋放了,car物件才會釋放。可以驗證一下,我們把Block2 = Block1這行程式碼去掉。


沒有問題,在Block1和car物件的作用域結束那裡,car就被釋放了,而不像之前的在Block2後面才釋放。所以說,arc還是很牛逼的,它已經幫助處理好了oc物件的引用問題,不像非arc下面,需要程式設計師自己去控制,如果是stack block的話,要千萬小心,需要自己控制生命週期,如果是heap block的話,就需要自己呼叫Block_copy和Block_release來進行控制。arc就簡單多了,自動處理好了,如果block裡面引用了外面的變數,直接就是堆block了,如果是oc物件,也不用關心記憶體釋放問題,就算是block傳遞出去了,也無需關心,都自動幫你處理好了,像上面的例子,如果block傳遞出來了(到car物件作用域外面),那麼car物件的生命週期也被延長了,實際就是arc情況下,編譯器做了些手腳,插入了引用計數增加的程式碼。