簡體   English   中英

objective-C:關於復制/保留NSString的簡單問題

[英]objective-C: simple question about copy/retain NSString

如果我將NSString設置為屬性

@property (copy) NSString* name;

我總是想用(復印件),這樣,如果它的價值變化,這樣的字符串中的所有對象仍然有舊值(指定位置 )。

但是,如果我的NSString不是類屬性會發生什么,但它只是在代碼中聲明了? 在每次分配新值時,是保留還是復制?

謝謝

這取決於你如何聲明它。 您應該閱讀有關內存管理的文檔 基本上規則是:

NSString *aString = [NSString stringWithString:@"Hello"];
NSString *bString = [NSString stringWithFormat:@"%@", @"Hello"];

在這些情況下,不會復制或保留字符串。 它是自動釋放的,這意味着它將在下次自動釋放池耗盡時自動解除分配。 您不必在它們上調用release方法。 (因此,分配新值不會導致泄漏。)

NSString *cString = [[NSString alloc] initWithFormat:@"%@", @"Hello"];
[cString release];

根據Objective C約定,使用alloc並且保留計數為1的方法不是自動釋放的,因此您需要顯式釋放它們。 分配新值而不釋放舊值將導致泄漏。

您還可以在字符串上顯式調用“復制”方法或“保留”方法。 在任何一種情況下,新字符串的保留計數為1並且不會自動釋放,因此在分配新值之前,需要在其上調用release方法。

NSString *dString = [cString retain];
NSString *eString = [cString copy];

...
[dString release];
[eString release];

如果它是一個屬性,並且你使用self.variableName,那么這將由你來處理(通過使用@synthesize生成的getter和setter)。 如果明確地執行此操作,則必須確保對已調用保留或復制的變量調用release。

編輯:正如下面的一些評論員所指出的那樣,在“所有權”方面考慮管理通常是描述這些想法的首選,而不是保留計數。

如果它不是屬性並且只是在代碼中聲明,則需要明確保留或復制它,即

NSString myString = [otherString copy];

要么

NSString myString = [otherString retain];

無論哪種方式,您還需要確保它在某個時刻發布。

如果你沒有使用屬性的setter,比如self.name = @"foo"[self setName:@"foo"] ,而是直接賦值變量,比如name = @"foo" ,這沒關系根本就是如何申報財產。

您必須了解,屬性語法只是編寫訪問器方法的快捷方式(在本例中為-name-setName: 如果您沒有調用這些方法(通過設置屬性隱式),那么它們在內部的工作方式並不重要(這是您通過retaincopy指定的方式)。

暫無
暫無

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

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