内存管理和实例变量?

时间:2010-11-25 15:09:32

标签: iphone objective-c memory-management

通常当我创建一个对象并将其分配给一个实例变量时,我会分配一个临时对象,调用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];
}

2 个答案:

答案 0 :(得分:2)

就内存管理而言,两种解决方案都很好。但您可能希望更喜欢initdealloc中的直接访问权限,请参阅this related question

答案 1 :(得分:1)

版本002是Apple批准的答案,因为在init中使用访问器的缺陷在理论上更糟糕。基本上,子类可以选择覆盖您的访问者,然后您将向尚未初始化的子类对象发送消息。

但是,除了init和dealloc之外的其他地方,请使用版本001。