0

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

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

非常感谢。

4

2 回答 2

1

你需要释放它,是的。(您不会取消分配事物。您释放了对它们的所有权,因此它们可能会被取消分配。)

你的代码是正确的。

规则是您必须释放从名称以“alloc”或“new”开头或包含“copy”的方法收到的任何对象。您还必须释放您保留的任何对象。由于您调用-copyon stringInput,您有责任最终释放您从中收到的对象。

于 2014-08-16T20:47:31.847 回答
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

在这种情况下 stringA由您的类在 dealloc释放,但您不必编写代码来执行此操作;ARC 为您服务。

于 2014-08-16T21:12:29.280 回答