具體而言,swift中的arc記憶體管理是對引用型別的管理,即對類所建立的物件採用arc管理。而對於值型別,如整型、浮點型、布林型、字串、元組、集合、列舉和結構體等,是由處理器自動管理的,程式設計師不需要管理它們的記憶體。
一、引用計數
每個swift類建立的物件都有乙個內部計數器,這個計數器跟蹤物件的引用次數,稱為引用計數(
reference count
,簡稱rc
)。當物件被建立的時候,引用計數為1,每次物件被引用的時候會使其引用計數加1,如果不需要的時候,物件引用斷開(賦值為nil),其引用計數減1。當物件的引用計數為0的時候,物件的記憶體才被釋放。
下圖是記憶體引用計數原理示意圖。圖中的房間就好比是物件的記憶體,乙個人進入房間開啟燈,就是建立乙個物件,這時候物件的引用計數是1。有人進入房間,引用計數加1;有人離開房間,引用計數減1。最後乙個人離開房間,引用計數為0,房間燈關閉,物件記憶體才被釋放。
二、示例:swift自動引用計數
下面我們通過乙個示例了解一下swift中的自動引用計數原理。下圖是employee類建立的物件的生命週期,該圖描述了物件被賦值給3個變數,以及它們的釋放過程。
上述**第①行宣告了employee類,第②行**是定義構造器,在構造器中初始化儲存屬性,並且在**第③行輸出構造成功資訊。第④行**是定義析構器,並在**第⑤行輸出析構成功資訊。
**第⑥~⑧行是宣告3個employee型別變數,這個時候還沒有建立employee物件分配記憶體空間。**第⑨行是真正建立employee物件分配記憶體空間,並把物件的引用分配給ref1變數,ref1與物件建立「強引用」關係,「強引用」關係能夠保證物件在記憶體中不被釋放,這時候它的引用計數是1。第⑩行**ref2 = ref1是將物件的引用分配給ref2,ref2也與物件建立「強引用」關係,這時候它的引用計數是2。第⑪行**ref3 = ref1是將物件的引用分配給ref3,ref3也與物件建立「強引用」關係,這時候它的引用計數是3。
然後在**第⑫行通過ref1 = nil語句斷開ref1對employee物件的引用,這時候它的引用計數是2。以此類推,ref2 = nil時它的引用計數是1,ref3 = nil時它的引用計數是0,當引用計數為0的時候employee物件被釋放。
我們可以測試一下看看效果,如果設定斷點單步除錯,會發現**執行完第⑨行後控制台輸出:
員工blake 已經構造成功。
析構器輸出的內容直到執行完第⑭行**才輸出:
員工blake 已經析構成功。
這說明只有在引用計數為0的情況下才呼叫析構器,釋放物件。
深入講解Swift的記憶體管理
前言 llvm編譯器的好 swift的記憶體管理除了要注意引用迴圈之外,幾乎全部被llvm編譯器包攬,不需要開發人員操心。swift 是自動管理記憶體的,這也就是說,我們不再需要操心記憶體的申請和分配。當我們通過初始化建立乙個物件時,swift 會替我們管理和分配記憶體。而釋放的原則遵循了自動引用計...
swift 記憶體管理
不管在什麼語言裡,記憶體管理的內容都很重要,所以我打算花上比其他 tip 長一些的篇幅仔細地說說這塊內容。swift 是自動管理記憶體的,這也就是說,我們不再需要操心記憶體的申請和分配。當我們通過初始化建立乙個物件時,swift 會替我們管理和分配記憶體。而釋放的原則遵循了自動引用計數 arc 的規...
Swift 記憶體管理
1 object c 經歷兩個階段 1 手動引用計數記憶體管理 manual reference counting,mrc 2 自動引用計數記憶體管理 automatic refernce counting,arc 2 引用型別 記憶體分配到 堆 上,需要人為管理。值型別 記憶體分配到 棧 上,有處...