iOS記憶體管理系列之一 物件所有權與引用計數

2021-06-06 14:24:35 字數 1528 閱讀 6598

記憶體管理是iphone或ipad開發中最為重要的一部分。掌握好了記憶體管理,開發出的應用就能執行流暢;掌握不好,開發出的東西就會效率低下,且容易崩潰。從本文開始,我將分幾次詳細介紹ios記憶體管理的方方面面,包括物件的所有權與引用計數、自動釋放與便捷方法、訪問器方法與屬性、一些會改變引用計數的特殊情況、以及乙個總結。希望這些介紹會對開發者有所幫助。

-----物件所有權(ownership)與引用計數(retain count、reference count)-----

當乙個所有者(owner,其本身可以是任何乙個objective-c物件)做了以下某個動作時,它擁有對乙個物件的所有權(ownership):

1. 建立乙個物件。包括使用任何名稱中包含「alloc」、「new」、或者「copy」的方法。

2. 保留(retain)乙個物件。

乙個物件可以有多個所有者,乙個所有者也可以擁有多個物件。

相應的,引用計數增減的基本規則是:

1.當所有者建立乙個物件時,該物件的引用計數為1。

2.當所有者保留它時,該物件的引用計數加1。

3.當所有者釋放(release)它時,該物件的引用計數減1。

與此相關的,當乙個所有者對於乙個物件的引用計數的增減總計為0時,它放棄了對這個物件的所有權。

現在我們可以從兩個不同的角度來看objective-c的記憶體管理問題。從物件所有權的角度來看,當乙個物件有著至少乙個所有者(owner)的時候,它依然存在;當它沒有任何所有者的時候,它會被釋放掉。從引用計數的角度看,乙個物件存在時,其引用計數大於零;當乙個物件的引用計數為零時,它會呼叫dealloc方法並釋放掉。這兩個角度的關係是:在所有權的背後起作用的機制是引用計數機制;我們通過引用計數的增減來理解所有權的概念;但是你只應當使用所有權的概念來管理記憶體,因為如果你試圖直接獲取物件的引用計數,那麼得到的數將讓你感到匪夷所思——系統的一些框架會「偷偷」增減物件的引用計數。

回顧一下,記憶體管理的目標是:當乙個物件的某個所有者依然需要使用它時,保證這個物件的存在;當乙個物件的所有所有者都不再需要它時,保證這個物件被銷毀。因此只要任何乙個所有者在使用完乙個物件之後釋放掉它,那麼以上記憶體管理的目標就可以實現。我們可以得出任何乙個所有者(記住,所有者本身也只是乙個物件)所應當遵守的基本步驟:

擁有乙個物件 -> 使用乙個物件 -> 放棄物件的所有權。

從引用計數的角度來看就是:

還需要這個物件時,保持對其增減為正;不再需要這個物件時,保持對其增減為0。

下圖很好地詮釋了這些基本規則:所有者1和所有者2單獨地執行了擁有物件、使用物件、放棄物件所有權的步驟;當所有者1不再需要該物件時及時放棄了所有權,但此時所有者2依然擁有該物件,因此該物件依然存在,所有者2可以繼續使用它;當所有者2也不再需要該物件時,也放棄掉所有權,這時物件以不再有任何所有者(相應的引用計數也變為0),因此立刻被銷毀掉。

需要注意的是,所有者2只是複製了該物件的指標,並沒有使用copy方法,因此複製指標這個操作本身並不增加物件的引用計數;而正因為所有者2希望能使用該物件,因此通過retain方法成為它的所有者,也保證了所有者1放棄該物件時,物件不被銷毀。

iOS記憶體管理系列之一 物件所有權與引用計數

記憶體管理是iphone或ipad開發中最為重要的一部分。掌握好了記憶體管理,開發出的應用就能執行流暢 掌握不好,開發出的東西就會效率低下,且容易崩潰。從本文開始,我將分幾次詳細介紹ios記憶體管理的方方面面,包括物件的所有權與引用計數 自動釋放與便捷方法 訪問器方法與屬性 一些會改變引用計數的特殊...

ruby之一物件比較

ruby物件的比較有三種方式 1 比較兩個物件的值是否相等,返回 true,flase 等於 不等於 a 1 b 1.0 a b true2 比較兩個物件的值 型別是否相等,返回 true,flase eql?a 1 b 1.0 a.eql?b flase a為整數型,b為浮點型 3 比較兩個物件在...

java基礎之一 物件,介面

equals int t1 1 int t2 2 person p1 new person person p2 new person t1 t2 true p1 p2 false p1.equals p2 true此處重點說明string和integer物件 string記憶體位置說明 string...