управление памятью и переменные экземпляра? - PullRequest
1 голос
/ 25 ноября 2010

Обычно, когда я создаю объект и назначаю его переменной экземпляра, я выделяю временный объект, вызываю установщик 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];
}

Ответы [ 2 ]

2 голосов
/ 25 ноября 2010

Что касается управления памятью, оба решения хороши.Но вы можете предпочесть прямой доступ в init и dealloc, см. этот связанный вопрос .

1 голос
/ 25 ноября 2010

Версия 002 - одобренный Apple ответ, потому что ловушки использования аксессора в init теоретически хуже. По сути, подкласс может выбрать переопределение вашего метода доступа, и тогда вы отправите сообщение объекту подкласса, который еще не инициализирован.

Однако везде, кроме init и dealloc, используйте версию 001.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...