Может ли количество сохраняемых объектов в Objective-C упасть ниже нуля?
Я изучил ручное управление памятью в Objective-C, и в каждой статье говорилось: "Когда количество сохраняемых объектов падает до 0, вызывается метод dealloc и объект уничтожается". И больше ничего.
Но нет ответа на несколько вопросов: Могу ли я сбросить счет удержания ниже 0? Можно ли позвонить [object release]
несколько раз подряд, прежде чем объект умрет, и заставьте счет удержания упасть ниже 0? И если я это сделаю, Вселенная все еще будет существовать?
Google не дает мне ничего, например: "Зачем вам вообще задавать этот вопрос? Никому нет дела. Пойдите и почитайте еще раз об управлении памятью".
2 ответа
Если вы позвоните release
когда счет удержания 1
, dealloc
немедленно называется. Таким образом, счет удержания даже не доходит до 0
,
Дальнейшие звонки release
вызовет сбой во время выполнения, так как вы будете разыменовывать освобожденный объект.
Так что нет, вселенная не будет существовать в этой точке:)
Число сохранений может быть 0 или выше, но никогда не меньше. Когда объекту выделяется куча памяти (alloc init
) счет сохранения равен 1. Затем можно увеличить счет хранения, вызвав retain
на нем (насколько я знаю, неограниченное количество раз, но я могу ошибаться).
призвание release
просто уменьшил количество сохраняемых данных на 1. Затем система периодически проверяет количество сохраняемых объектов и освобождает любые объекты со счетом 0.
призвание release
на уже освобожденном объекте - то же самое, что вызов любого метода на NULL
объект и должен просто вернуть NULL
или же void
, Однако, если вы явно управляете кучей памяти, вы должны ОЧЕНЬ знать, что делаете.
Несколько интересных моментов:
Почему счет удержания может быть больше 1?
Это сделано для того, чтобы объект не был освобожден, хотя он все еще требуется для чего-то другого. Например, у вас есть pet
owner
а также vet
, pet
Экземпляр принадлежит owner
пример. owner
идет к vet
экземпляр и vet
вступает во владение pet
также. На период времени pet
имеет двух владельцев и, следовательно, (если retain
был вызван) имеет счет сохранения 2. Допустим, что owner
затем выпущен до vet
закончил с pet
; если все было сделано правильно, pet
он не будет освобожден, просто его счет reatain уменьшится до 1 при вызове release
от owner
, vet
затем можно закончить с pet
, вызов release
и pet
будет освобожден.
ARC
Как я уверен, вы знаете, что все это было заменено автоматическим подсчетом ссылок. Как разработчики, мы теперь должны просто знать тип отношений, которые объект имеет с другим.
Поэтому, если вы создаете объект сейчас, он будет освобожден, когда он выпадет из области видимости, если только он не имеет прочных отношений (не принадлежит) другому объекту. Вы все еще можете получить повторные циклы, в которых два объекта имеют прочные отношения друг с другом и поэтому никогда не могут быть освобождены.
Извинения за очень длинный ответ, но управление памятью является основной частью прикладного программирования и очень интересно.