通常当我创建一个对象并将其分配给一个实例变量时,我会分配一个临时对象,调用iVar setter来保留该对象,然后释放temp对象。然而,今天早上我正在查看init,并注意到如果我只是直接分配iVar,它会被alloc保留,同时在调用setter或执行dealloc时也会正确释放。如果我理解正确的话,我很好奇吗?
@property(nonatomic, retain) CLLocationManager *locationManager;
@synthesize locationManager;
// VERSION 001
- (id)init {
self = [super init];
if(self) {
CLLocationManager *tempManager = [[CLLocationManager alloc] init];
[self setLocationManager:tempManager];
[tempManager release];
}
return self;
}
// VERSION 002
- (id)init {
self = [super init];
if(self) {
locationManager = [[CLLocationManager alloc] init];
}
return self;
}
- (void)dealloc {
[locationManager release];
[super dealloc];
}
答案 0 :(得分:2)
就内存管理而言,两种解决方案都很好。但您可能希望更喜欢init
和dealloc
中的直接访问权限,请参阅this related question。
答案 1 :(得分:1)
版本002是Apple批准的答案,因为在init中使用访问器的缺陷在理论上更糟糕。基本上,子类可以选择覆盖您的访问者,然后您将向尚未初始化的子类对象发送消息。
但是,除了init和dealloc之外的其他地方,请使用版本001。