Что лучше всего объясняет разницу между [myVar dealloc] и [myVar release]? - PullRequest
7 голосов
/ 07 апреля 2009

Мне кажется, я знаю разницу, но не знаю, как это правильно объяснить.

dealloc полностью и немедленно удаляет память, зарезервированную этой переменной.

release уменьшает счетчик сохранения памяти этой переменной на -1. если бы это было 1, то это 0, так что в тот момент он имел бы тот же эффект, что и dealloc.

это верно? или есть лучшее краткое объяснение?

Ответы [ 2 ]

13 голосов
/ 07 апреля 2009

Совершенно верно.

Но вы не будете использовать dealloc при использовании объекта, потому что вы не знаете, что такое счетчик удержания. И тебе все равно. Вы просто говорите, что вам это больше не нужно, позвонив по номеру release. И как только никто этого не сделает, объект сам вызовет dealloc.

7 голосов
/ 07 апреля 2009

Все правильно, но один ключевой момент, который вам не хватает, это то, что вы никогда не должны вызывать dealloc самостоятельно. Вот некоторая информация из документации Apple по методу dealloc NSObject:

(из http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/nsobject_Class/Reference/Reference.html#//apple_ref/occ/instm/NSObject/dealloc)

Вы никогда не отправляете сообщение dealloc непосредственно. Вместо этого, сделка объекта метод вызывается косвенно через метод протокола выпуска NSObject (если сообщение о выпуске приводит к счетчик удержания получателя становится 0). См. Программирование управления памятью Руководство по какао для более подробной информации о Использование этих методов.

Подклассы должны реализовывать свои собственные версии dealloc, чтобы позволить освобождение дополнительной памяти потребляется объектом - например, динамически распределяемое хранилище для данных или переменные экземпляра объекта, принадлежащие освобожденный объект. После выполнение класса освобождение, метод подкласса должны включать версии суперкласса из dealloc через сообщение супер:

...