@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];
}
加里
答案 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通知,因此在这种情况下也要考虑性能损失。