点符号dealloc?

时间:2009-10-01 17:07:38

标签: objective-c cocoa memory-management

@property (copy) NSString *name;
@property (copy) NSString *orbit;
@property (copy) NSNumber *mass;
@property float surfaceTemp;
@property float rotationSpeed;

目前有这个

- (void)dealloc{
    [name release];
    name = nil;
    [orbit release];
    orbit = nil;
    [mass release];
    mass = nil;
    [super dealloc];
}

如果我使用Dot Notation(Objective-C 2.0)写这个是吗?

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

加里

2 个答案:

答案 0 :(得分:10)

-dealloc中使用setter方法是不好的做法。请改用[name release]

-dealloc期间调用setter可能会产生意想不到的后果。如果使用KVO,设置属性可能会触发其他代码运行导致副作用,因为您的对象已经开始释放实例变量。即使不使用KVO,如果你的setter方法依赖于可能已经发布的其他实例变量,这可能会导致潜在的问题。

(更新以反映评论)

答案 1 :(得分:0)

根据我的经验self.name = nil[name release]; name = nil的做法不同。我的猜测是,在合成的setter中有一些代码可以避免nil赋值,但是YMMV。我在其中观察到的属性也被指定为(nonatomic, retain),因此您可能也会看到一些差异。

更重要的是,self.符号发送KVO通知,因此在这种情况下也要考虑性能损失。