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