【问题标题】:memory management and instance variables?内存管理和实例变量?
【发布时间】:2011-05-15 18:35:28
【问题描述】:

通常当我创建一个对象并将其分配给一个实例变量时,我分配一个临时对象,调用 iVar 设置器来保留该对象,然后释放该临时对象。但是,我今天早上查看 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];
}

【问题讨论】:

    标签: iphone objective-c memory-management


    【解决方案1】:

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

    【讨论】:

    • 我从上一个问题中知道不在 dealloc 中使用 setter,很高兴知道我也不应该在 init 中使用它们。那么我是否正确地说,对于 init 和 delloc 直接分配 iVar,如 v_002。对于其他方法,最好使用 alloc 对象,使用 setter 分配 iVar 并最终释放对象。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-06
      • 2012-12-10
      • 1970-01-01
      • 2020-08-19
      • 1970-01-01
      • 2022-09-27
      • 1970-01-01
      相关资源
      最近更新 更多