Почему мы должны выпускать? - PullRequest
6 голосов
/ 19 ноября 2009

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

Итак, мой вопрос: если nil освобождает старое значение объекта и устанавливает для него значение nil, почему бы нам не использовать только nil, почему мы также должны использовать release.

Way1:

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

Way2:

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

Какая реальная разница в way1 и way2, если использовать way1, почему не использовать только way2?

Ответы [ 2 ]

11 голосов
/ 19 ноября 2009

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

Если ваше приложение является сборщиком мусора, релиз не активен и может быть пропущен. В противном случае это очень и очень необходимо. Следовательно, путь 1 всегда корректен, а путь 2 корректен только при сборке мусора.

Примечание : Этот ответ не относится к проектам, использующим автоматический подсчет ссылок. В ARC указатель nil делает отправкой релиза объекту.

1 голос
/ 19 ноября 2009

Как сказал BJ, установка значения nil не освобождает память, а в среде, не содержащей gc, может произойти утечка памяти. Альтернатива, которая также может быть действительной, будет

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

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