Условия, при которых continueCount увеличивается или уменьшается

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

Может ли кто-нибудь дать мне представление об основных условиях, при которых continueCount увеличивается или уменьшается (без сохранения, выделения и освобождения)...


person Ranjeet Sajwan    schedule 23.11.2010    source источник


Ответы (3)


keepCount объекта изменяется в следующих случаях:

  • Когда вы создаете объект (новый или распределенный, копируемый или изменяемый), его счетчик сохранения равен 1.

  • Когда вы отправляете объекту сообщение об удержании, его счетчик удержаний
    увеличивается на 1.

  • Когда вы отправляете объекту сообщение об освобождении, его счетчик сохранения
    уменьшается на 1.

  • Когда вы отправляете объекту сообщение об автоматическом освобождении, его счетчик хранения будет уменьшен на 1 (не
    сразу, как в случае освобождения, а через какое-то время в будущем).

Вы можете просмотреть этот сообщение, чтобы получить подробную информацию о том, как работает управление памятью в iPhone.

person Krishnan    schedule 23.11.2010

Краткий ответ: нет.

Чуть длиннее:

Действия с вашей стороны, которые обычно ожидают изменения счетчика удержания, – это retain, release, autorelease, а также вызов методов, имя которых содержит new или copy. Однако в некоторых случаях они могут не этого делать по соображениям реализации, а вместо этого делать что-то другое. Кроме того, есть много других вещей, которые вы можете сделать, например добавить объекты в коллекции, которые могут изменить количество сохраненных вещей таким образом, что это не ваше дело.

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

Пожалуйста, просто не надо.

Беспокойство о сохранении счетчика почти всегда приводит к ошибкам, а не к их устранению.

person walkytalky    schedule 23.11.2010
comment
autorelease не изменяет счетчик удержания. - person JeremyP; 23.11.2010
comment
Чтобы уточнить: то, что изменяет счетчик сохранения, - это слив или выпуск пула автоосвобождения, в который автоосвобождение помещает объект. - person JeremyP; 23.11.2010
comment
@Jeremy: правда, и на самом деле я начал редактирование, которое прояснило бы это и некоторые другие детали, но я потерял волю к жизни, не закончив его. - person walkytalky; 23.11.2010

Счетчик сохранения объекта — это деталь реализации, о которой вам не следует беспокоиться. Вы должны действительно беспокоиться только о том, когда вы получаете и теряете право собственности на объект. Вот почему:

+alloc возвращает объект со счетчиком сохранения, равным 1. Однако вы немедленно отправляете ему сообщение инициализации, которое может вернуть вам совершенно другой объект. Например

NSString* foo = [[NSString alloc] initWithString: @"foo"];

Дает вам объект с числом сохранений равным 1, верно? Неверно в текущих реализациях Cocoa. Строка, возвращаемая +alloc, немедленно освобождается, и вместо нее возвращается ссылка на @"foo". Счетчик сохранения @"foo" равен INT_MAX.

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

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

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

Если вы просто думаете о сохранении и освобождении прав собственности, все то, что я только что сказал, становится не относящимися к делу деталями реализации.

person JeremyP    schedule 23.11.2010