IOS 學習筆記14 記憶體管理(2)記憶體管理策略

2021-06-22 14:32:54 字數 3093 閱讀 4639

文章中帶有lpstudy的字樣表明是我個人的理解,可能會有不對的地方,敬請指教。

[html]view plain

copy

記憶體管理策略

在引用計數機制下,你可以採用nsobject  protocol的方法和和標準的方法命名約定進行記憶體管理。nsobject也定義了乙個dealloc方法,它在物件被釋放的時候自動觸發。本篇文章描述了在cocoa中你需要了解的所有記憶體管理的基本規則,也提供了一些例項來讓你正確的使用它。

基本記憶體管理規則

記憶體管理模型是建立在物件所有者基礎上的,任何乙個物件都可能有乙個或者多個擁有著。只要乙個物件至少有乙個所有者,那麼它就繼續存在,如果沒有擁有者,它就被自動釋放。因此,你需要確定何時你擁有乙個物件,何時你不再擁有它。cocoa遵循以下的約定:

·你擁有你自己建立的物件

你可以通過使用「alloc」,「new」,「copy」或者「mutablecopy」這樣的方法來建立物件。

·你可以使用retain來獲取物件的所有權)

·當你不再使用某乙個物件,放棄它的所有權

你可以通過傳送release或者autorelease訊息來釋放物件的所有權。在cocoa術語中,放棄物件的所有權意味著「釋放」乙個物件

·當你不再擁有乙個物件時,你不能釋放它

這個與前面陳述的規定相一致

簡單的例子

為了展示那些規定,看看下面的**片段

通過使用alloc方法,person物件被建立,因此當它不再被使用時,它隨後呼叫release方法。person的姓名沒有使用任何的獲取擁有權的方法,因此它也沒有呼叫release方法。注意:本例子使用了release而不是autorelease

使用autorelease傳送延遲釋放訊息

當你需要傳送延遲釋放訊息的時候,你可以使用autorelease,典型的使用時候是當你需要從乙個方法中返回乙個物件。例如,你可以像這樣實現fullname方法:

- (nsstring *)fullname

你通過帶呼叫alloc方法擁有了這個字串。為了遵循記憶體管理規則,在你失去對string的訪問許可權之前,你必須釋放string的所有權。如果你採用了release方法,那麼string就會在它被返回之前被釋放.通過使用autorelease,你表明你想去釋放擁有權,但是你又允許方法的呼叫者在它釋放之前去使用返回的字串。

你也可以像下面這樣實現fullname方法

- (nsstring *)fullname

遵循基本的規則,你通過呼叫stringwithformat,你並沒有擁有string。因此,你可以安全的從方法中返回string。

作為對照,下面的實現是錯誤的

- (nsstring *)fullname

通過命名的約定,毫無疑問fullname的呼叫者擁有了返回的string,但是呼叫者沒有任何理由去釋放返回的string,於是string所占用的記憶體洩露了。

你並不擁有返回引用的物件的所有權

(nsstring).

在這些情況下,上述描述的規則依然適用。當你觸發它們的任何乙個方法的時候,你並沒有建立nserror物件,因此你並沒有擁有它,你也就沒有必要去釋放它。例子如下:

nsstring *filename = <#get a file name#>;

nserror *error = nil;

nsstring *string = [[nsstring alloc] initwithcontentsoffile:filename

encoding:nsutf8stringencoding error:&error];

if (string == nil)

// ...

[string release];

釋放所有者物件的dealloc的實現

nsobject定義了乙個dealloc方法,當乙個物件沒有擁有者而且它的記憶體被**的時候,dealloc方法會被自動觸發。dealloc方法是為了釋放物件的記憶體,安排它所擁有的資源,當然這也包含它擁有的例項變數。

下面的例子展示了在person 類中怎麼使用dealloc方法

@inte***ce person : nsobject {}

@property (retain) nsstring *firstname;

@property (retain) nsstring *lastname;

@property (assign, readonly) nsstring *fullname;

@end

@implementation person

@synthesize firstname=_firstname, lastname=_lastname;

// ...

- (void)dealloc

[_firstname release];

[_lastname release];

[super dealloc]; }

@end

attention:

·     你從不要去主動觸發另乙個物件的dealloc方法。

·     在自己的dealloc實現的末尾,你必須觸發基類的dealloc方法

·     當程式終止時,物件可能並沒有觸發dealloc方法。由於在程式退出的時候,程式所占有的記憶體被自動清理,因此,僅僅讓作業系統自己去清理資源比單純的觸發記憶體管理方法更有效。

core foundation使用相似但是不同的規則

)規則並不適用於返回object-c物件的方法。例如,在下面的**片段,你不需要釋放myinstance的所有權。

myclass *myinstance = [myclass createinstance];

ios學習筆記之記憶體管理

一,記憶體管理型別定義 1,基本型別 任何c的型別,eg int,short,char,long,long long,struct,enum,union等屬於基本型別或結構體 記憶體管理對於c語言的基本型別無效 2,oc型別 非基本型別 任何繼承於nsobject類的物件都屬於oc型別 也就是除了c...

iOS開發學習筆記三 記憶體管理

最近在看唐巧先生著的 ios開發高階 此內容摘自此書,為方便個人記錄與學習 引用計數的應用 由於引用計數簡單有效,除了objective c語言外,微軟的com component object model c 11 c 11提供了基於引用計數的智慧型指標share prt 等語言也提供了基於引用計...

IOS 筆記 《一》 記憶體管理

footnote ps 學習ios很長時間了,一直沒總結過,以後盡量一周寫一篇。提到記憶體管理就要提mrr manual retain release 和arc automatic reference counting 先說mrr manual retain release oc建立物件原理 1.分...