Число сохраняемых объектов никогда не опускается ниже 1, несмотря на преднамеренное превышение - PullRequest
2 голосов
/ 08 февраля 2011

Я проверяю количество оставшихся объектов

NSLog(@"r = %d", [aObject retainCount];

Кажется, что самое низкое значение, которое я могу получить, это "r = 1", даже если я намеренно добавляю дополнительные вызовы "release"

[aObject release];

Ограничение "r = 1" сохраняется, даже если я пытаюсь поместить тестовые коды "release" и "NSLog" в метод dealloc объекта.

Кажется, что во время выполнения Cocoa мои дополнительные выпуски игнорировались вплоть до "r = 1" перед тем, как завершить работу с EXC_BAD_ACCESS в самом конце примера программы (без GC).

Мое единственное объяснение (предположение) состоит в том, что нам нужен r> = 1 для доступа к объекту. И во время выполнения Какао просто пытается удержать счет удержания любого объекта от преждевременного достижения нуля.

Может ли кто-нибудь подтвердить или исправить меня, если я ошибаюсь?

Ответы [ 6 ]

6 голосов
/ 08 февраля 2011

Как я узнал от bbum (и других), не используйте retainCount.Он не предназначен для того, чтобы быть информативным в отношении сохранения состояния объекта.Просто прочитайте Руководство по программированию управления памятью и не отклоняйтесь от его практики.Не пытайтесь использовать retainCount для управления памятью.

См. Сколько раз я освобождаю выделенный или сохраненный объект? ,

Когда использовать -retainCount? ,

и т.д.

6 голосов
/ 08 февраля 2011

Когда количество сохраняемых объектов приближается к 0 (т. Е. Число сохраняемых единиц равно 1, и освобождение было вызвано снова), он освобождается вместо того, чтобы пытаться выполнить окончательный декремент.

3 голосов
/ 08 февраля 2011

Если retainCount ever == 0, особенность достигнута!

Куриное яйцо.Или это яйцо и курица.

По определению, освобождение объекта с одним оставшимся удержанием означает, что объект освобожден.Любые последующие вызовы методов приведут к неопределенному поведению.

1 голос
/ 08 февраля 2011

Инструмент Instruments обеспечивает обнаружение зомби, что более эффективно, чем попытка отладки подсчета ссылок Cocoa самостоятельно.Используйте команду Xcode Run> Run with Performance Tool> Zombies.Он определяет, когда вы вызываете метод для освобожденного объекта, и показывает историю сохранения / выпуска для полного жизненного цикла объекта.Жизнь намного лучше, так как Apple добавила этот инструмент.

0 голосов
/ 31 июля 2015

Когда ссылка на объект становится равной 0, этот объект становится "объектом-зомби", но вы все равно можете отправить ему сообщение retainCount, потому что Xcode по умолчанию не "Включал объекты-зомби" в управлении памятью, что означает, что Xcode не сделал проверить объекты зомби.

Если вы заставите Xcode проверять объекты-зомби, отметив галочкой «Включить объекты-зомби» в «Редактировать схему-> Выполнить-> Диагностика-> Включить объекты-зомби», вы получите сообщение об ошибке при продолжении отправки сообщения на объект после его ссылки стать 0.

Снимок:

enter image description here

0 голосов
/ 08 февраля 2011

Философия управления памятью на основе подсчета ссылок заключается в том, что объект существует, пока на него ссылаются> = 1 раз. retainCount = 0 теоретически означает, что на объект больше не ссылаются, поэтому вы не можете получить [aObject retainCount] == 0;, потому что если вы все еще можете передавать сообщения, объект существует и остается на него ссылается aObject, поэтомуминимум retainCount = 1.

...