簡體   English   中英

釋放屬性(Objective-C)

[英]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.

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