我正在尝试创建非原子拷贝访问器,并且我到处读到应该在最后释放该对象。所以,如果你能帮助我理解我是否正确地做到了,我将不胜感激。以下是否正确?
@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以及是否正确执行。
非常感谢。
答案 0 :(得分:1)
你需要发布它,是的。 (您不会解除分配。您释放了对它们的所有权,并且可能因此被取消分配。)
您的代码是正确的。
规则是您必须从名称以“alloc”或“new”开头或包含“copy”的方法释放您收到的任何对象。您还必须释放您保留的任何对象。由于您在-copy
上致电stringInput
,您有责任最终释放您从中获得的对象。
答案 1 :(得分:1)
@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
在这种情况下,您的类在dealloc上发布了stringA ,但您不必编写代码来执行此操作; ARC为你做到了。