簡體   English   中英

解除分配非原子復制setter

[英]Deallocating nonatomic copy setter

我正在嘗試創建非原子復制訪問器,並且我到處讀到應該在最后釋放該對象。 所以,如果你能幫助我理解我是否正確地做到了,我將不勝感激。 以下是否正確?

@interface ClassA: NSObject
{
   NSString* stringA;
}

@property (nonatomic, copy) NSString* stringA;

@implementation ClassA

@synthesize stringA;

-(void) setStringA: (NSString*) stringInput {
   if(stringA != stringInput) {
      [stringA release];
      stringA = [stringInput copy];
   }
}

-(void) dealloc {
    [stringA release];
    [super dealloc];
}

我正在尋找一個確認是否需要在dealloc方法中最終解除分配stringA以及是否正確執行。

非常感謝。

你需要發布它,是的。 (您不會解除分配。您釋放對它們的所有權,因此可能會取消分配。)

你的代碼是正確的。

規則是您必須從名稱以“alloc”或“new”開頭或包含“copy”的方法釋放您收到的任何對象。 您還必須釋放您保留的任何對象。 由於您在stringInput上調用-copystringInput您有責任最終釋放從中收到的對象。

@Ken Thomases是對的; 你的代碼是正確的。 但有幾件事情:

你真的不需要聲明ivar,或合成屬性,或編寫自己的setter; 這一切都是為你完成的。 所以你的代碼(雖然正確)可以簡化為:

@interface ClassA: NSObject
@property (nonatomic, copy) NSString* stringA;
@end

@implementation ClassA

-(void) dealloc {
    [_stringA release];
    [super dealloc];
}

@end

其次,如果您正在使用ARC(我推薦),則可以進一步簡化代碼(通過完全刪除dealloc覆蓋)。

@interface ClassA: NSObject
@property (nonatomic, copy) NSString* stringA;
@end

@implementation ClassA
@end

在這種情況下stringA 您在的dealloc類發布,但你不必編寫代碼來做到這一點; ARC為你做到了。

暫無
暫無

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

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