Какая разница между установкой объекта на nil или отправкой его сообщения о выпуске в dealloc

У меня есть Object:

MyClass *obj= [[MyClass alloc] init];

Какая разница между:

[obj release]; // Only obj own this object.

и

obj = nil;

Является ли iOS deallocs obj, когда я устанавливаю obj = nil?

У меня есть указатель, иногда я устанавливаю его на объект, иногда. Итак, когда я хочу освободить указатель, я должен проверить, это нуль?

Ответ 1

Этот ответ из предыдущего десятилетия,

теперь представляет только исторический интерес.

Сегодня вы должны использовать ARC.

Приветствия


Самый короткий ответ НЕ, просто установите его на нуль. Вы должны освободить его. Установка его в nil не имеет связи с его выпуском. Вы должны освободить его.

Однако стоит помнить, что , если это свойство, тогда

self.obj = nil;

в действительности выпустит его для вас. Конечно, вы не должны забывать о себе. часть!!!!

Действительно,

self.obj = anyNewValue;

действительно выпустит для вас старую память, почистит все до мелочей и настроит ее на новое значение. Итак, self.obj = nil - это просто частный случай, он освобождает и очищает все, а затем просто оставляет его на нуле.

Итак, если кто-то читает это, это новое и полностью запутанное памятью,

  • Вы должны отпустить его, [x release], прежде чем устанавливать его на nil x = nil

  • IF вы используете свойство, "не забывайте о себе. thingy"

  • IF, вы используете свойство, вы можете просто сказать self.x = nil или действительно self.x = somethingNew, и он позаботится о выпуске и о том, что другие сложные неприятные вещи.

  • В конце концов вам придется изучить все сложные вещи о выпуске, autorelease, blah blah blah. Но жизнь коротка, забудьте об этом сейчас: -/

Надеюсь, что это поможет кому-то.

Снова заметьте, этот пост теперь совершенно не прав. Используйте ARC.

Только исторический интерес.

Ответ 3

iOS не поддерживает сбор мусора, а это означает, что выполнение obj = nil приведет к утечке памяти. Если вам нужен автоматический контроль за освобождением, вы должны сделать что-то вроде: obj = [[[NSObject alloc] init] autorelease] (вы должны НЕ отпустить его, если вы это сделаете). Автореклама приведет к тому, что объект будет автоматически выпущен, когда закончится текущее событие NSRunloop. NSRunloop автоматически истощает его NSAutoReleasePool для каждой итерации событий, что обычно очень полезно.

Ответ 4

Настройка объекта nil приведет к утечке памяти (если вы возьмете права собственности путем выделения, сохранения или копирования), потому что у нас нет указателя на эту конкретную ячейку памяти.

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

[obj release];
obj=nil;