天天看點

【iOS7的一些總結】1、ARC自動引用計數

對于軟體開發而言,引用計數Reference Counting不是一個陌生的概念。在元件對象模型COM中,這就是一個非常重要的概念。每一個對象都維持着一個量稱為“引用計數”,标志着有多少“客戶”程式在引用目前的對象。隻要還有“客戶”引用目前對象,也就是引用計數非零,那麼這個對象将會儲存在記憶體中不會消失;如果沒有任何“客戶”引用目前對象了,那引用計數将被設為0,此時該對象将會從記憶體中釋放。通過這種機制可以防止已經廢棄的對象繼續存在在記憶體中造成記憶體洩露,同時也可以防止釋放一個本來已經不存在的對象而引起bug。

要形象地解釋,可以把這個過程了解為“幾個酒鬼去酒館喝酒”。這幾個酒鬼走進酒館坐下,酒保給他們上了一大桶啤酒并沒人發了一根吸管。這裡就可以把啤酒桶當做是程式中的“對象”,酒鬼作為客戶程式。當一個酒鬼把吸管插在酒桶上,那麼這個“客戶”就開始引用目前對象,其引用計數為1。當第二個酒鬼也把吸管插在酒桶上開始喝酒時,引用計數便成為2。此時如果第一個酒鬼停止喝酒并拔掉吸管,那麼依然有一個人在用吸管喝酒,也就是引用計數由2變為1。同樣,第三、第四個酒鬼可能也會開始用吸管喝酒,也可能暫時停止喝酒。在這種環境下,“引用計數”就可以認為是一個數量,說明了目前有幾個酒鬼的吸管連在酒桶上;隻要至少有一個人在用習慣喝酒,那麼酒保就不會吧酒桶收走,隻有酒桶中的就被喝光了,所有人都拔掉了吸管,此時酒桶的“引用計數”變為0,這時酒鬼們結賬走人,酒保會收走酒桶,這意味着這個對象不會有客戶程式引用,将會被從記憶體中釋放掉。采取“引用計數”這種方法會給酒保省掉很多麻煩:試想,如果還有人在喝着呢,酒保就把酒桶收走了,那個酒鬼肯定會發酒瘋把桌子掀了(O(∩_∩)O哈哈~);如果人都結賬走人了,酒桶還在桌子上放着,這樣就會降低酒吧的翻台率,影響利潤。這就是引用計數在防止記憶體洩露和提高代碼效率中的作用。

在iOS開發中,一樣也存在這些問題,而且開發者一不留神就會遺忘。是以從iOS5開始,蘋果提供了ARC這樣的一個機制來處理這樣的問題,可以在代碼中自動對對象進行retain、release操作,減輕了開發者的負擔。舉一個簡單的例子:

使用ARC必須注意的一些問題:

1、不能顯示地調用dealloc/retain/release/retainCount/autorelease;除了dealloc之外其他函數也不能進行重寫;

2、不能再C結構體中使用指向一個objective-c對象的指針,而應該使用objective-c類;

3、由于屬性property的getter函數不能以new開頭,除非對屬性的擷取方法進行重寫,否則屬性的名稱也不能以new開頭。

ARC引入了新的屬性限定詞:

對象的屬性預設為是strong類型,strong類型意味着實實在在的引用和控制,也就是一名“喝酒的酒鬼”。可以認為strong與retain代表相同的含義。而weak類型不同,weak類型的引用并不意味着對對象的生存周期産生控制,隻要該對象的強引用不存在了,弱引用也将置為nil;也就是說,weak類型的引用者并不是酒鬼,而是在旁邊看着這群酒鬼醉酒失态胡言亂語還看得津津有味的無聊人士(呵呵),隻要有酒鬼在喝酒他就在旁邊看,酒鬼走了他也就走了,酒保也不會因為他還在看這個空酒桶而繼續把桶放在桌子上嘛。

使用strong/weak來防止循環引用:

有些時候,兩個對象之間可能存在互相關系,如果兩個關系都是強引用的話,那麼這兩個對象永遠不會存在引用計數為0的時候,也就永遠得不到釋放。将其中一個設定為weak将很好地解決這個問題。

繼續閱讀