Лучшая практика очистки памяти для приложений iPhone? - PullRequest
3 голосов
/ 12 декабря 2008

Я видел пример исходного кода, который использует различные способы освобождения / освобождения объектов, поэтому мне было интересно, какой путь считается «лучшим». Несколько опций на -dealloc:

1) Отпустить объекты

- (void)dealloc {
    [obj1 release];
    [obj2 release];
    [super dealloc];
}

2) Установить объекты на ноль

- (void)dealloc {
    self.obj1 = nil;
    self.obj2 = nil;
    [super dealloc];
}

3) Отменить выделение объектов напрямую

- (void)dealloc {
    [obj1 dealloc];
    [obj2 dealloc];
    [super dealloc];
}

Какой путь самый лучший? Плюсы и минусы для каждого?

Ответы [ 2 ]

8 голосов
/ 12 декабря 2008

Метод 1 - единственный рекомендуемый метод. Также рекомендуется установить их равными нулю после того, как вы их отпустили.

Метод 2 работает только для свойств, которые управляют сохранением собственного объекта / значения, поэтому он не универсален. И если вы реализуете свой собственный метод установки, который выполняет другие действия при изменении свойства, вы можете получить нежелательные побочные эффекты, вызвав его в [dealloc].

Метод 3 нарушает принцип подсчета ссылок, поскольку он освобождает объекты, даже если что-то еще удерживает их [удерживать], поэтому, когда другие объекты получат к ним доступ в следующий раз, ваша программа потерпит крах. Вы никогда не должны вызывать [dealloc] напрямую - пусть среда выполнения вызывает его, когда последний владелец вызывает [release].

1 голос
/ 12 декабря 2008

Если obj1 и obj2 являются свойствами, использующими методы доступа @ synthesize-d, то метод 1 и метод 2 эквивалентны. Если какое-либо из этих двух условий не соответствует действительности, то эффект довольно различен. Если они не являются свойствами, то метод 2 просто устанавливает указатели на ноль, не делая ничего, что могло бы освободить объекты. И если они являются свойствами, но вы реализовали свои собственные методы установки, метод 2 вызывает эти методы с «nil» в качестве аргумента. Это эквивалентно методу 1 или нет, зависит от того, как вы реализовали эти методы. Если ваши пользовательские сеттеры делают что-либо значимое, когда аргумент равен nil, метод 2 гарантирует, что этот код будет выполнен.

Как сказал Марко, метод 3 просто неправильный. Если вы видели пример кода, делающего это, то автор может на самом деле не знать, что он делает.

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