![](/img/trans.png)
[英]Custom Setter for Strong, Copy, weak and assign with atomic and nonatomic?
[英]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
上調用-copy
, stringInput
您有責任最終釋放從中收到的對象。
@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.