簡體   English   中英

NSString基礎知識 - 內存 - 保留 - 復制

[英]NSString basics - memory - retain - copy

這是我的代碼:

NSString *xyz=[NSString stringWithFormat:@"%i %@",10,@"Sagar"];

現在我正在采取其他字符串,如下所示。

NSString *x2=[xyz copy];

我不知道到底會發生什么? 是這樣的,x2有xyz的ref的參考嗎?

NSString *x3=[xyz retain];

這里會發生什么,x3有一個新的內存有復制的字符串或[xyz copy]嗎?

現在,如何從內存中刪除所有這三個字符串?

NSString *xyz=[NSString stringWithFormat:@"%i %@",10,@"Sagar"];

這將創建自動釋放的NSString實例 - 它將在自動釋放池耗盡時釋放(通常在下一個運行循環中)。

NSString *x2 = [xyz copy];

在理論上-copy消息將創建一個具有保留計數1的對象的新實例(即你必須在某處釋放它),但由於NSString對象是不可變的,那么[xyz copy]將被優化為[xyz retain],因此它將指向同一個實例。

NSString *x3=[xyz retain];

x3將指向與xyz(和x2)相同的實例,並且其保留計數將遞增 - 您必須在某處釋放您的對象。

現在,如何從內存中刪除所有這三個字符串?

確保將所有保留(復制)消息與釋放和內存配對將被釋放。
閱讀Objective-c內存管理指南以獲取更多詳細信息。

在這種情況下,熟悉與objective-c和cocoa(以及相關框架)中的內存管理相關的消息命名約定/規則特別有用:

如果使用名稱以“alloc”或“new”開頭或包含“copy”(例如,alloc,newObject或mutableCopy)的方法創建對象,或者向其發送保留消息,則獲取對象的所有權。 您有責任使用release或autorelease放棄您擁有的對象的所有權。 在收到對象的任何其他時間,您不得釋放它。 Cocoa內存管理編程指南

因此,您可以假設,您從根據上述方案未命名的消息中收到的每個對象都是自動釋放或通過其他方式處理(它可能是由其他對象管理的共享對象)等等。)

如果您記住這一點,您的問題可以快速得到解答:

  1. 您從一條消息中收到NSString * xyz,該消息的名稱與上述規則中描述的方案不匹配(不是alloc,不是new,不是copy,不是retain)。 不能發布它。

  2. 您從名為copy的消息中收到NSString * x2。 必須釋放它

  3. 您從名為retain的消息中收到NSString * x3。 必須釋放它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM