在以下方法中释放对象的正确方法是什么?

时间:2012-07-11 09:49:59

标签: iphone ios ipad

请告诉我哪一个是以下方法中的最佳方法?

@implementation Person
@synthesize name;
- (void)dealloc { [self.name release]; [super dealloc]; }
@end



 @implementation Person
    @synthesize name;
    - (void)dealloc { [name release]; [super dealloc]; }
    @end



@implementation Person
@synthesize name;
- (void)dealloc { [name release]; name = nil;[super dealloc]; }
@end

3 个答案:

答案 0 :(得分:2)

第一个肯定是错的:

(From Apple's documentation)

  

不要在初始化方法和dealloc中使用访问器方法。唯一的   您不应该使用访问器方法来设置实例变量   在初始化方法和dealloc中。

<小时/> 现在,第二个是Apple在他们的示例应用程序中使用的。

<小时/> 在我看来,虽然最后一个是(可能)最好的,因为通过将指针设置为nil可确保对(已释放)指针的任何调用只会将消息转发到nil(这是安全的) ,对释放对象的调用不是)。另请注意,如果将该属性定义为retain设置为nil,则还会调用release

答案 1 :(得分:0)

这个对我来说是最好的

@implementation Person
@synthesize name;

-(void)dealloc { 
   self.name = nil; 
   [super dealloc]; 
}
@end

你的第一个错误是错误的

答案 2 :(得分:0)

对于非ARC版本,第三个是最好的,因为它通过将释放变量指向nil来处理它。

但是根据Apple的建议,请使用ARC来构建项目。

来自APPLE的文件

  

在自动参考计数或ARC中,系统使用相同的参考计数   引用计数系统作为MRR,但它插入适当的   内存管理方法在编译时为您调用。 你是   强烈建议将ARC用于新项目。如果你使用ARC,那里   通常无需了解底层实现   虽然在某些情况下可能会在本文档中描述   有帮助的。