Счетчик удержания может быть равен 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
не будет освобожден, его счетчик retain просто уменьшится до 1 вызовом release
из owner
. Затем vet
может закончить с pet
, вызвать release
и pet
будет освобожден.
АРК
Я уверен, вы знаете, что все это было заменено Автоматическим подсчетом ссылок. Как разработчики, мы теперь должны просто знать о типе отношений одного объекта с другим.
Поэтому, если вы создадите объект сейчас, он будет освобожден, когда он выйдет из области действия, если только он не будет иметь сильной связи (принадлежит) другому объекту. Вы все еще можете получить циклы retain, когда два объекта имеют тесные отношения друг с другом и, следовательно, никогда не подходят для освобождения.
Извиняюсь за очень длинный ответ, но управление памятью является основной частью программирования приложений и очень интересно.
person
Rob Sanders
schedule
27.09.2016
dealloc
. См. многочисленные вопросы о том, почемуretainCount
сообщает 1 для объектаdealloc
ed. - person Avi   schedule 27.09.2016