__block與__weak


其實這倆個東西是八竿子打不着的存在,但是我看很多人會分別用於mrcarcblock避免循環引用,之前我用着也是一頭霧水。後來似乎明白了,現在解釋一下


__block是一個存儲域說明符。如果你只學過oc的話,你肯定不明白啥意思,但是你如果學過c語言的話,可能還有點概念,其實它類似於static,auto等,標明變量的存儲區域。


在C語言中,數據存儲區域分爲如下四項

全局區:用於存儲變量和static變量

常量區:存放常量的地方(const修飾,與變量相反,如果你有點swift常識的話,可能會更好理解,就是var和let的區別)

棧區:系統自動給局部變量分配的內存區

堆區:用戶申請的內存區,用編譯器提供的函數newmalloc申請。


所以__block修飾的對象是存儲在什麼區域呢,這還和block本身所在的存儲區域有關,一句話倆句話以後再說。


總之__block是一個存儲域說明符。


__weak卻是一個所有權修飾符。表明對象所有權,最明顯的對比爲__strong,我感覺是應用arc產生的一個東西。


但考慮一下我們在block爲了避免死循環真正的原理,所有其實mrc下__block用來避免循環引用並不是完全的正解,而arc下__weak用來避免循環循環卻是當之無愧。。


後來,我瞭解到mrc,標明__block的變量在block copy的時候是不會被retain的,引用計數不增加,所以引用計數最多就是1,所以OC順利的把倆個八竿子打不着的東西用到了一個地方。


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