Подтвердить что ты не робот

IPhone - dealloc - Релиз против нуля

Удивление, если кто-то с опытом может объяснить это немного больше. Я видел примеры...

  [view release];

  view = nil;  

.... внутри (void) dealloc.

В чем разница и лучше ли другое? Каков наилучший способ?

При выполнении теста keepCount я лично видел, что nil отбрасывает счет от 3 до 0, но релиз только уменьшает его с 3 до 2.

4b9b3361

Ответ 1

То, что вы видели, возможно, это:

1) [foo release];
2) self.bar = nil;
3) baz = nil;
  • Освобождает объект, обращаясь к нему через переменную экземпляра foo. Переменная экземпляра станет висящим указателем. Это предпочтительный метод в dealloc.

  • Назначает nil свойству bar для себя, что на практике освободит все, что сохраняется в настоящее время. Сделайте это, если у вас есть настраиваемый параметр для свойства, который должен очищать больше, чем просто переменную экземпляра, поддерживающую свойство.

  • Перепишет указатель baz, ссылающийся на объект с помощью nil, но не освободит объект. Результатом является утечка памяти. Никогда не делайте этого.

Ответ 2

Если вы не используете свойства (где self.property = nil также выпустит объект), вы должны ВСЕГДА следовать релизу кодом, который устанавливает ссылку на nil, как вы начертили:

[view release]; view = nil;

Причина в том, что он избегает его возможности использования ссылки, которая недействительна. Это редко и трудно, но это может произойти.

Это еще более важно в viewDidUnload, если вы освобождаете IBOutlets - это более реалистичный сценарий, когда ссылка может ухудшиться из-за того, что предупреждения о памяти выгружают представление, а затем некоторый другой код в представлении, пытающийся использовать перед повторным загрузкой представления.

В принципе, это просто хорошая практика, и в какой-то момент это спасет вас, если вы сделаете это привычкой.

Ответ 3

@bbullis22 вы заметили, что отсчет количества возвратов от 3 до 0, потому что вы установили ссылку на nil. то вы попросили удерживать номер "ноль", равный нулю. однако объект, на который ссылались, имеет тот же показатель удержания - 1 (из-за установки ссылки на ноль). используя release, ссылка все еще ссылается на один и тот же объект, так что вы видите, что в этой ситуации количество отсчетов удержания от 3 до 2.

Ответ 4

Что касается использования внутри вашего кода, то в dealloc вам не нужно присваивать свойству, releas все, что вам нужно сделать.

- (void)dealloc {
    [myProperty release]; // don't need to assign since you won't have the object soon anyway
    [super dealloc];
}

Ответ 5

Я думаю, что использование обоих - это система безопасности. Только с release вы можете столкнуться с проблемой, если вы включили управление подсчетами ссылок. Вы бы выпустили объект, возвратив его память в систему, но указатель будет по-прежнему действительным.

С nil вы гарантированно не сработаете, так как отправка сообщения на nil ничего не делает.