Object C 記憶體管理

2021-12-29 23:38:35 字數 2436 閱讀 2736

object c 記憶體管理

一.     基本概念:

1.   iphone系統中的objective-c的記憶體管理機制是比較靈活的,即可以拿來像c/c++一樣用,也可以加個autoreleasepool讓它公升級為半自動化的記憶體管理語言;

2.   引用計數是例項物件的記憶體**唯一參考

引用計數(retaincount)是objective-c管理物件引用的唯一依據。呼叫例項的release方法後,此屬性減一,減到為零時物件的dealloc方法被自動呼叫,進行記憶體**操作,也就是說我們永不該手動呼叫物件的dealloc方法.

3.   「擁有的概念」

1) 擁有乙個物件的使用權,我們稱為擁有這個物件;物件的擁有者個數至少為1,物件才得以存在,否則它應該立即銷毀;

2) 獲得乙個物件所有權的方法:當對物件做alloc,copy,和retain操作之後;

4.   「引用」d的概念

物件導向領域裡有個引用的概念,區別於繼承,引用常被用來當做偶合性更小的設計。乙個例項擁有另乙個例項的時候,我們稱它為引用了另乙個例項。

比如classa類的乙個屬性物件的setter方法:

- ( void )setmyarray:(nsmutablearray *)newarray 變數的release順序與初始順序相反;

三.     記憶體管理的原則:

以 1 2 3為a類,(retaincount+1);

以 4,5為b類:retaincount-1

1 .對於同乙個物件所做的,a與b的呼叫次數保持一致;

2. 凡是通過alloc,retain,copy等手段獲得物件的所有權;必須在不適用的 使用自己呼叫release或autorelease釋放;

3. 不要釋放不屬於自己的物件;

4. autorelease只是意味著延遲傳送乙個release訊息;

5. 對於便利構造器和訪問器來說,不用進行釋放,因為沒有獲得物件的使用權;

四.     使用小例子:

1.person *person1 = [[person alloc] initwithname:@」張三」];

nslog(@」name is %@」,person1.name); //假設從這往後,我們一直都不使用person1 了,應該把物件給釋放了。

[person1 release];

2.erson *person2 = [person alloc]initwithname:@」李四」];

nsstring *name = person2.name;nslog(@」%@」,name); //假設從這以後,我們也不使用person2了。

[person2 release];

//不應該釋放name,因為name是我們間接獲得的,所以沒有它的所有權

3. 由便利構造器產生的物件不應當使用者銷毀,而是由便利構造器本身完成。

+(id) personwithname:(nsstring *)aname

person *person = [[person alloc]

initwithname:aname];

return person; }

①錯誤,因為返回person物件後,類失去了釋放這個物件的機會;

②如果在return語句前加上:[person release];也錯誤,因為物件已經銷毀,不能使用;

③:正確做法:return語句前加上:[person autorelease];

(二)使用便利構造器建立的物件,不需要進行釋放;

如:-(void) printhello

nsstring *str = [nsstring

stringwithformat:@」hello」];

nslog(@」%@」,str); }

4. 訪問器和設定器:

1)在設定器中,保持對新傳入物件的所有權,同時放棄舊物件的所有權。

-(void) setname:(nsstring *) aname

2) 在訪問器中,不需要retain或release.

-(nsstring *)name

3) 用訪問器獲得的物件,使用完畢後不需要釋放。

-(void) printname

5. 常見錯誤:

1) 未使用設定器

-(void) reset

2)記憶體洩露

-(void) reset{

nsstring *newname = [[nsstring alloc]

initwithformat:@」thenew」];

[self setname:newname];

3) 釋放沒有所有權的物件

-(void) reset{

nsstring *newname = [nsstring

stringwithformat:@」thenew」];

[self setname:newname];

[newname release];

Object c記憶體管理

記憶體管理 物件的生命週期包括以下幾個時期 物件初始化 物件接收訊息和執行操作 物件被釋放 判斷乙個物件是否結束,用到引用計數器 引用計數器的基本概念 1 每個人物件有乙個整數值,這個整數值與物件本身關聯,稱為引用計數器 2 當某些地方需要使用這個物件時,可以將引用計數器加1,表示使用這個這個物件 ...

Object C程式設計記憶體管理

記憶體管理的範圍 任何繼承了 nsobject 的物件,對其他基本資料型別 int char float double struct enum 等 無效 物件的基本結構 1.每個 oc物件都有自己的引用計數器,是乙個整數,表示 物件被引用的次數 即有多少人正在使用這個 oc物件 2.每個 oc物件內...

Object C中管理記憶體

object c之中採用一種保留記錄的方式記錄我們所建立的所有的物件,並且,當該計數減少為0的時候,object c自動收回分配給乙個物件的記憶體。text text1 text alloc init text text2 text alloc init 每乙個物件的計數都為1,我們可以通過reta...