Путаница в вызовах в деаллоках - PullRequest
1 голос
/ 21 февраля 2012

У меня есть основной вопрос здесь.

Я знаю, что dealloc будет вызываться, когда счетчик ссылок на объект станет равным нулю, и dealloc освобождает все ресурсы, удерживаемые объектом, или освобождает память, верно?

Количество ссылок на объект становится равным нулю, если мы отправляем сообщение об освобождении этому объекту, верно?

Давайте рассмотрим следующий объект с его свойством, созданным как,

@property (retain) NSString* myString;//reference count 1

и dealloc

[myString release];//reference count 0
[super dealloc];

Я не освобождаю объект myString где-либо, кроме как в dealloc.

У меня вопрос, кто делает myString счетчик ссылок на объекты равным нулю, чтобы вызывать dealloc?

Пожалуйста, проясните мои сомнения.

Ответы [ 3 ]

2 голосов
/ 21 февраля 2012

Все, что поддерживает право собственности на объект, отвечает за его освобождение. Например, если код, который вы опубликовали, является единственной вещью, которая поддерживает владение NSString, хранящимся в myString, то при вызове release счетчик ссылок будет уменьшен, и объект, вероятно, будет освобожден (строковые литералы различны). Теперь, если вы передали myString или что-то еще запросили myString и сохранили его, то этот код также отвечает за его освобождение, что может быть до или после того, как вы выпустили его в методе dealloc.

Я рекомендую обратиться к документации для усиления этой концепции.

1 голос
/ 21 февраля 2012

Допустим, ваше свойство myString находится в вашем классе MyClass.Каждый экземпляр вашего класса создан и (предположительно!) Выпущен.Когда этот экземпляр [выпущен], вызывается ваш метод dealloc MyClass.В свою очередь, ваш деллок вызывает вызов свойств ваших свойств, который, в свою очередь, вызывает их деллок и т. Д., Пока вы не достигнете «дна» этого стека объектов, используя объекты.

0 голосов
/ 21 февраля 2012

Ваш объект будет освобожден только в случае совпадения пар удержания / освобождения. Если вы следите за управлением памятью какао (см. Документацию apple - руководство по программированию управления памятью) Согласно правилам, вы являетесь единственным «владельцем» на данный момент - и запустите dealloc zap по последней ссылке - освободите объект.

...