Почему мы должны выпускать?

Я часто вижу, когда мы выпускаем объект 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 ответа

Решение

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

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

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

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

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

obj = nil;
Другие вопросы по тегам