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

2021-06-27 23:45:06 字數 1519 閱讀 5715

定義乙個person類

其實引用計數這個問題大家可以理解為租房子的問題, 如果有retain alloc 代表這個人租了這間大房子, 拿到了一把鑰匙, 引用計數代表房子一共有的鑰匙的數量, release代表退房歸還鑰匙

person * p = [[person alloc] init];//房東蓋好了一間房子, 現在是房東乙個人

//alloc 

開闢空間

,引用計數由0變為

1//retaincount,用於檢視物件的引用計數

nslog(@"%lu", [p retaincount]);

person * p1 = [p retain];// retain一次, 代表又來乙個人租房

nslog(@"p1 = %lu", [p1 retaincount]);//引用計數1-2

nslog(@"%lu", [p retaincount]);//引用計數1-2

person

* p2 = p1;//沒有retain 也沒有alloc 引用計數不變. 就相當於p1帶他的朋友來住,朋友沒有鑰匙的

//release 減少

引用計數(歸還鑰匙)

[p release];//

引用計數2-1

[p release];//

引用計數1-0(但是如果我們去輸出的話, 可能是會顯示崩潰, 或者是1, 原因如下:)

nslog

(@"%lu"

, [p 

retaincount

]);// 首先

這樣寫肯定是不對的

, 最後一次

release,

系統已經**掉這塊記憶體

,空間已經還給系統

,空間已經不歸你管理

,如果此時在訪問

,就訪問了一塊沒有所有權的空間

,所以下面的操作可能會出現野指標問題

我們還以上面的租房子問題為例, 現在這間房子最後乙個人已經走了, 已經沒有人住了, 按說鑰匙已經全部交上去了, 但是我們現在的操作就像是又拿著他的鑰匙去開那個門, 這是非常不安全的.那為什麼有時候會崩潰而有時候可以列印出1呢, 這是因為如果這塊記憶體別人還沒有使用, 就像是房子還沒有租出去, 你再回去拿鑰匙開門還是安全的, 但是如果這間房子又已經租出去, 即已經有別的資料在使用這塊記憶體, 那你再回去開門, 那你的處境是相當的不安全有木有???

[p release];//

野指標問題

+過渡釋放,這個也很好理解, 大家可以理解成有房客拿一把鑰匙, 不但要開門, 還要拿著這個鑰匙再去歸還一次, 要房東再次退房子押金, 違法了, 直接崩~

記憶體問題其實除了上面提到的野指標和過度釋放, 還有乙個, 那就是記憶體洩露, 記憶體洩露我們可以理解為, 一為租客租房子最後鑰匙沒有歸還, 這樣房東也沒有辦法開啟這間房子, 這間房子就沒有辦法再租出去, 導致記憶體浪費, 當然, 房東在有別的房子出租的時候, 對於他來講並沒有太大的影響, 但是一旦這樣的房客有好多,房子不夠租, 房東掙錢會越來越慢, 最終可能導致做不下去~

本文只是個人對記憶體引用計數的一些理解 有什麼不對的地方, 大家多多指出~

記憶體管理之引用計數

在一些開發語言中,記憶體管理使用的是引用計數的方法,比如python objc等。採用引用計數,開發人員不需要管理記憶體,能夠從記憶體管理繁瑣的工作中脫離出來,從而將更多的精力花費在開發程式上。引用計數的原理 python和objc中的每個物件內部都維護著乙個引用計數器,當新建乙個物件,或者有其他物...

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類,...