協議中定義的方法和標準方法命名約定的組合提供。的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...