解除分配非原子复制setter

时间:2014-03-04 15:18:31

标签: objective-c memory-management copy nonatomic

我正在尝试创建非原子拷贝访问器,并且我到处读到应该在最后释放该对象。所以,如果你能帮助我理解我是否正确地做到了,我将不胜感激。以下是否正确?

@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以及是否正确执行。

非常感谢。

2 个答案:

答案 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为你做到了。