記憶體管理之引用計數

2022-05-08 09:48:11 字數 973 閱讀 9859

在一些開發語言中,記憶體管理使用的是引用計數的方法,比如python、objc等。

採用引用計數,開發人員不需要管理記憶體,能夠從記憶體管理繁瑣的工作中脫離出來,從而將更多的精力花費在開發程式上。

引用計數的原理:python和objc中的每個物件內部都維護著乙個引用計數器,當新建乙個物件,或者有其他物件引用該物件時,引用計數器就會加1;當引用減少一次的時候,引用物件的計數器就會減1,當引用計數器為0時,系統會自動的**這個物件所占用的記憶體。

舉例來說,在python中:

a = 5  #

分配了一塊記憶體,該記憶體的值是物件5,a指向了這塊記憶體,物件5的引用計數值為1

b = a #

b也指向了物件5所在的記憶體,此時物件5的引用計數值為2

b = 6 #

分配了新的記憶體,該記憶體的值是物件6,b指向了這塊記憶體,物件5的引用計數值減1變為1

del a #

物件5的引用計數再減少1,變為0,此時系統就可以**物件5所占用的記憶體

在python中,檢視兩個引用是否指向了同乙個物件,可以使用 id() 函式來驗證。

在ios開發中,從ios5開始引入了arc(automatic reference counting)機制,程式在編譯和執行時,xcode可以自動的給**新增記憶體釋放的**,因此程式設計師不再需要手動寫釋放**,即 release 操作。

簡單介紹一下objc中的記憶體管理。

在objc中,當呼叫乙個物件的 alloc、retain、new、copy方法時,該物件的引用計數器就會加1,當呼叫該物件的release方法時,該物件的引用計數器就會減1,當乙個物件的引用計數器為0時,系統會自動的**該物件所占用的記憶體。**該物件的記憶體時,會呼叫該物件的 dealloc 方法。因此,可以通過檢視是否呼叫了dealloc方法來判斷是否釋放了該物件的記憶體。

由於現在大多數的ios開發都是基於arc的,因此就不再詳細介紹ios的記憶體管理,如有興趣,可以參考網上的這篇文章:

OC中記憶體管理問題之引用計數

定義乙個person類 其實引用計數這個問題大家可以理解為租房子的問題,如果有retain alloc 代表這個人租了這間大房子,拿到了一把鑰匙,引用計數代表房子一共有的鑰匙的數量,release代表退房歸還鑰匙 person p person alloc init 房東蓋好了一間房子,現在是房東乙...

OC 記憶體引用計數 記憶體管理機制

記憶體引用計數 用於管理物件記憶體的 使用次數 注意 是對記憶體的引用計數 只有當記憶體的引用計數為0時,記憶體自動釋放 release 僅僅讓通過指標讓記憶體的引用計數 1 assign 基本資料型別 retain 淺拷貝,但是引用計數會 1 property retain void setp p...

swift記憶體管理中的引用計數

在swift中,每乙個物件都有生命週期,當生命週期結束會呼叫deinit 函式進行釋放記憶體空間。觀察這一段 class person init name string,petname string deinit class pet deinit 這段 建立了兩個類,分別是person類和pet類,...