代码之家  ›  专栏  ›  技术社区  ›  fuzzygoat

内存管理和实例变量?

  •  1
  • fuzzygoat  · 技术社区  · 15 年前

    通常,当我创建一个对象并将其分配给一个实例变量i alloc一个temp对象时,调用ivar setter来保留该对象,然后释放temp对象。然而,今天早上我在查看init时注意到,如果我只是直接分配ivar,则它由alloc保留,同时在调用setter或执行dealoc时也被正确释放。我只是好奇我是否理解正确?

    @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 回复  |  直到 15 年前
        1
  •  1
  •   JeremyP    15 年前

    版本002是苹果公司认可的答案,因为在init中使用访问器在理论上更糟。基本上,子类可以选择重写访问器,然后向尚未初始化的子类对象发送消息。

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

        2
  •  2
  •   Community Mohan Dere    8 年前

    就内存管理而言,两种解决方案都很好。但您可能希望直接访问 init dealloc this related question .