2016-09-27 13 views
-2

Я изучил ручное управление памятью в Objective-C, и в каждой статье говорилось: «Когда значение удержания объекта падает до 0, вызывается метод dealloc и объект уничтожается». И больше ничего.Может ли показатель удержания объекта Objective-C упасть ниже нуля?

Но нет ответа на несколько вопросов: могу ли я оставить счетчик хранения ниже 0? Можно ли вызывать [object release] несколько раз подряд, прежде чем объект умрет, и заставить счетчик удержания упасть ниже 0? И если я это сделаю, вселенная сохранится?

Google ничего не дает мне, как: «Почему бы вам даже задать этот вопрос? Никто не заботится. Пойдите и прочитайте об управлении памятью еще раз».

+1

Попробуйте найти «над выпуском объектива c» –

+0

Предложение, данное Google, абсолютно правильно для вас. Похоже, что вы находитесь в неправильной области работы, вы должны быть мыслителем, а не разработчиком. Чтобы быть ясным, ваши исследования/усилия по управлению памятью очень плохие. Из всех заданных вопросов нет никакого отношения к реальному миру. Его вроде спрашивают, почему земля - ​​это сфера? Если вам не нравится Objective C, вы можете создать свой собственный язык и идти вперед и сделать счетчик счета до -ve. Давайте также знать, если бы это имело смысл для вас тогда –

+1

Почему бы вам даже задать эти вопросы? Никто не заботится. Пойдите и прочитайте об управлении памятью еще раз. – matt

ответ

2

Если вы позвоните по номеру release, когда количество удержаний 1, dealloc немедленно вызывается. Таким образом, количество удержаний никогда не достигает 0.

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

Так нет, Вселенная не существует в этой точке :)

+0

Обратите внимание, что количество удержаний никогда не падает до нуля; время выполнения не теряет циклы, уменьшающиеся до уничтожения объекта. – bbum

+2

Спасибо за дополнительные подробности @bbum, я обновил ответ! –

-3

сохранить кол может быть 0 или выше, но не меньше. Когда объект выделяет кучную память (alloc init), счетчик удержания устанавливается равным 1. Затем вы можете увеличить количество удержаний, вызвав на нем retain (насколько я знаю неограниченное количество раз, но я мог ошибаться).

Вызов release просто уменьшила сохранить счет на 1. Система затем периодически проверяет сохраняют счетчики объектов и освобождает любого с числом 0.

Calling release на уже высвобождены объект является такой же, как вызов любой метод на объекте NULL и должен просто вернуть NULL или void. Однако, если вы объясняете управление памятью кучи, тогда вы должны быть ОЧЕНЬ осознавая, что вы делаете.

Некоторые интересные моменты:

Why can a retain count be more that 1?

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

ARC

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

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

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

+2

«Вызов освобождения на уже освобожденном объекте совпадает с вызовом любого метода в NULL». Только если указатель фактически был установлен на «nil». Отправка 'release' на освобожденный объект - ошибка программиста: неопределенное поведение. –

+3

Этот ответ начинается очень неправильно. Счет сохранения может ** никогда не быть 0 **. Система ** не ** периодически проверяет что-либо. Вызов метода на освобожденном объекте - это неопределенное поведение и будет сбой, это ** совсем не **, как вызов любого метода в 'NULL'. Впрочем, аналог 'vet' /' owner'/'pet' является пятном. – bbum