Может ли количество сохраняемых объектов в 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?

Это сделано для того, чтобы объект не был освобожден, хотя он все еще требуется для чего-то другого. Например, у вас есть petowner а также vet, pet Экземпляр принадлежит owner пример. owner идет к vet экземпляр и vet вступает во владение pet также. На период времени pet имеет двух владельцев и, следовательно, (если retain был вызван) имеет счет сохранения 2. Допустим, что owner затем выпущен до vet закончил с pet; если все было сделано правильно, pet он не будет освобожден, просто его счет reatain уменьшится до 1 при вызове release от owner, vet затем можно закончить с pet, вызов release и pet будет освобожден.

ARC

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

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

Извинения за очень длинный ответ, но управление памятью является основной частью прикладного программирования и очень интересно.

Другие вопросы по тегам