objc 記憶體管理

2021-08-31 22:00:19 字數 1979 閱讀 8508

1.在oc中,物件也具有生命週期。其也有產生、生存(接受訊息和執行操作)、交友(借助方法的組合和引數)、死去等屬性。

2.cocoa採用引用計數(reference counting)技術,來判斷該物件是否達到生命週期終結。當某段**需要訪問乙個物件時,該物件的reference counting 加一,當這段**訪問結束之後,rc 減1,當rc為0的時候,表示該物件不再有**訪問,可以被銷毀,其占用的記憶體將被系統**以便重用。

3.當使用alloc、new、copy方法建立物件時,其reference counting將被設定為1。使用retain,可以是reference counting加1,使用release 可以減少物件的保留計數器值。

4.當reference counting為0時,oc自動向物件傳送一條dealloc訊息。當然,你可以在類中重寫該方法,以釋放全部的資源。但是記住,一定不要呼叫dealloc函式。可以通過系統提供的一些方法,間接呼叫。檢視reference counting,可以通過retaincount訊息。

如現實世界一樣,物件也有所屬關係,如果乙個物件具有指向其他物件的例項變數,則該物件擁有這些物件。同樣,如果在乙個函式中建立了乙個物件,則稱該函式擁有他建立的這個物件。

經常對遇到類似以下的情況:

main() 

[car setengin:engin];

那麼engin是屬於main函式,還是car物件呢?如果是屬於main函式,則main函式需要決定engin什麼時候釋放,但顯然engin還在car物件中,這樣main函式就不知道什麼時候去釋放該物件,顯然engin不屬於main()函式,或者更確切的說是engin不僅僅屬於main()函式。

如果engin屬於car物件,情況和剛剛所述類似,所以engin不僅僅屬於他們中的任意乙個。

其實在setengin時,engin的reference counting已經+1,這樣由main()函式負責釋放一次,由engin函式負責釋放一次。(此處需要驗證,參考例子1,之後會設計乙個程式來驗證如上所述。)

首先給出設定器的三種寫法:

普通青年

- (void) setengin:(engin *)newengine

[engin release];

engin = [newengin retain];

文藝青年

- (void)setengin:(engin *) newengin

[newengin retain];

[engin release];

engin = [newengin retain];

2b青年

-(void) setengin:(engin *) newengin

engin = [newengin retain];

首先解釋2b青年,確實2到不想解釋。

engin *engin1  = [engin new]; //count:1

[car setengin: engin1]; //count:2

[engin1 release]; //count:1

如上面的注釋,計數器最終沒有清零,應為2b青年對newengin retain但是沒有release。造成記憶體洩露!!!

下面看看普通青年:

普通青年雖然首先對newengin release了,但是如果有如下情況,普通青年比2b青年更2:

engin *engin2 = [engin new];

[car2 setengin:[car1 engin]];

這次car2把car1的engin release了,這是計數器已經成0,即car1的engin已經被釋放。然後又呼叫car1的engin賦值,這次直接造成崩潰。

最後看看文藝青年是怎麼文藝的:

首先文藝青年先將newengin 計數器加一,然後去釋放engin,這樣不管engin和newengin是不是乙個物件,都沒有關係,因為先+1了,保證肯定大於等於2,然後去releae engin,在賦值。

objc記憶體管理

一 記憶體管理規則 1 對於通過呼叫帶有alloc copy mutablecopy new或者create一詞的方法建立的任何物件及其記憶體,你都擁有所有權。你負責在之後的某個時刻向該物件傳送release訊息來釋放資源。使用類似 foo alloc init.命令建立的物件需要釋放。任何使用類似...

Obj C記憶體管理(二)

autorelease的本質就是呼叫 nsautoreleasepool的addobject方法 imp caching 方法呼叫的實現 id autorelease class nsautoreleasepool class sel autorelease sel selector addobje...

記憶體管理 記憶體管理概述

儲存器的發展方向是高速 大容量和小體積,即儲存器嘗試更高讀寫速度,更大儲存容量,更小物理體積。在計算機中,常見的儲存器有 暫存器,快取,記憶體,硬碟,一般硬碟之類的輔助儲存器又稱外存。在平均讀寫速度上,有 暫存器 快取 記憶體 外存 在單位容量 上,有 外存 記憶體 快取 暫存器 cpu處理器只能直...