[英]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:
。 如果您沒有調用這些方法(通過設置屬性隱式),那么它們在內部的工作方式並不重要(這是您通過retain
或copy
指定的方式)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.