[英]Releasing a property (Objective-C)
我有一個@property,其定義如下:
@屬性(非原子的,保留)名稱;
在一個函數中,我解析一些xml並設置name屬性。 我的問題是,在保留新實例之前,我是否應明確釋放先前保留的實例?
舉個例子 :
myObj.name = [otherObj getName]; //保留計數+1
..
myObj.name = [otherObj getName]; //這是名稱的新實例,是否釋放了先前的名稱?
在綜合屬性設置器中,代碼執行的操作與此大致類似(我們將name
作為屬性名稱,並將_name
作為其引用的實例變量):
- (void) setName: (NSString *) newValue
{
if ( newValue == _name )
return;
[newValue retain];
[_name release];
_name = newValue;
}
現在,這顯示了根據上面的屬性聲明將發生的情況。 根據該屬性的其他可能屬性,該函數將使用[newValue copy]
而不是[newValue retain]
(如果指定了'copy'屬性),或者全部包裝在@synchronized(self)
塊中(如果“非原子”屬性未提供)。
我還應注意,由於您的屬性引用了實現NSCopying協議的NSString,因此您實際上應該使用copy而不是keep,即:
@property (nonatomic, copy) NSString * name;
這將導致綜合的setter使用-copy
而不是-retain
,這在您實際傳遞NSMutableString對象時更加安全。 不可變的字符串最終只能通過-copy
調用保留,而可變的字符串將創建新的不可變副本。 未能做到這一點意味着,在將字符串傳遞到setter之后,它可能會更改,從而在您不知道對象的情況下更改了值。
如果您已經為屬性綜合了訪問器(使用@synthesize
指令),則它們將負責在屬性重新分配后釋放支持該屬性的ivar。 您唯一想顯式釋放ivar的時間是當對象被釋放時。 因此,您的dealloc方法可能如下所示:
- (void)dealloc {
[name release];
// other cleanup here
[super dealloc];
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.