高階記憶體管理程式設計指南 記憶體管理政策

2021-09-10 17:52:40 字數 2541 閱讀 4812

協議中定義的方法和標準方法命名約定的組合提供。的nsobject類也定義了一種方法,dealloc即自動當物件被釋放呼叫。本文介紹了在 cocoa 程式中正確管理記憶體所需了解的所有基本規則,並提供了一些正確用法的示例。

記憶體管理模型基於物件所有權。任何物件都可能擁有乙個或多個所有者。只要乙個物件至少有乙個所有者,它就會繼續存在。如果物件沒有所有者,則執行時系統會自動銷毀它。為了確保在擁有物件時它是清楚的,當你沒有時,cocoa 設定以下策略:

要說明策略,請考慮以下**片段:

人物件是使用該alloc方法建立的,因此隨後release在不再需要時傳送訊息。不使用任何擁有方法檢索此人的姓名,因此不會傳送release訊息。但請注意,該示例使用的是release而不是autorelease

autorelease需要傳送延遲release訊息時使用 - 通常在從方法返回物件時使用。例如,您可以實現如下fullname方法:

- (nsstring *)fullname

你擁有返回的字串alloc。要遵守記憶體管理規則,您必須在丟失對該字串的引用之前放棄該字串的所有權。release但是,如果使用,則在返回字串之前將解除分配該字串(並且該方法將返回無效物件)。使用autorelease,表示您想放棄所有權,但允許方法的呼叫者在釋放之前使用返回的字串。

也。你可以實現這樣的fullname方法:

- (nsstring *)fullname

遵循基本規則,您不擁有返回的字串stringwithformat:,因此您可以安全地從方法返回字串。

相比之下,以下實現是錯誤的:

- (nsstring *)fullname

根據命名約定,任何沒有東西可以表示fullname方法的呼叫者擁有報道檢視的字串。因此呼叫者沒有理由釋放返回的字串,因此它將被洩露。

nsstring)所示。

在這些情況下,適用的規則與已經描述的相同。當您呼叫這些方法中的任何乙個時,不會都建立 ³³ 該nserror物件,因此不您擁有該物件。因此無需釋放它,如下例所示:

nsstring * filename = <#獲取檔名#>;

nserror *錯誤;

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

encoding:nsutf8stringencoding error:&error];

if(string == nil)

// ...

[string release];

即自動呼叫當乙個物件不具有擁有者和它的儲存器被** - 可可術語它是 「釋放」 或 「釋放」.. 該dealloc方法的作用是釋放物件自己的記憶體,並處置它擁有的任何資源,包括任何物件例項變數的所有權。

以下示例說明了如何dealloc為人類實現方法:

@inte***ce person:nsobject

@property(retain)nsstring * firstname;

@property(retain)nsstring * lastname;

@property(assign,readonly)nsstring * fullname;

@結束

@implementation人

// ...

- (無效)dealloc

[_firstname release];

[_lastname release];

[super dealloc];

}

@結束

重要說明:永遠不要dealloc直接呼叫另乙個物件的方法。

必須您在實現結束時呼叫超類的實現。

當應用程式終止時,不會可能向物件傳送dealloc訊息。因為程序的內存在退出時自動清除,所以僅僅允許作業系統清理資源比呼叫所有記憶體管理方法更有效。

myclass * myinstance = [myclass createinstance];

記憶體管理高階

dealloc是nsobject的乙個例項方法,與alloc對應,用於 開闢的記憶體空間,這個方法在物件引用計數為0是,有系統自動呼叫。通常我們在dealloc中釋放類的例項變數。dealloc的使用 void dealloc name release setter方法洩露的例項變數 super d...

linux高階程式設計 程式設計中的記憶體管理

記憶體管理 1.從地位址到高位址依次為 區 資料區 堆區 棧區 命令列引數及環境變數區域 2.區域性變數 區域性變數位於棧區 棧區特點 1.棧區當中變數未初始化之前都為隨機值 2.在變數作用域結束後,變數空間被作業系統收回 全域性變數 全域性變數位於資料區 資料區特點 1.資料區中變數未初始化之前都...

linux高階程式設計 前言 記憶體管理

楊強 linux高階程式設計 day01 am 格式控制符 p 中的p是pointer 指標 的縮寫。指標的值是語言實現 編譯程式 相關的,但幾乎所有實現中,指標的值都是乙個表示位址空間中某個儲存器單元的整數。printf函式族中對於 p一般以十六進製制整數方式輸出指標的值,附加字首0x。程式示例1...