我正在尝试创建非原子复制访问器,我到处都读到对象应该在最后释放。所以,如果你能帮助我了解我做得是否正确,我将不胜感激。以下情况是否正确?
@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
,因此您有责任最终释放从中接收的对象。
@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 为您做这件事。