解除分配非原子副本设置器



我正在尝试创建非原子复制访问器,我到处都读到对象应该在最后释放。所以,如果你能帮助我了解我做得是否正确,我将不胜感激。以下情况是否正确?

@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 为您做这件事。

最新更新