2012-03-05 2 views
0

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

Чтобы отладить, я включаю NSZombies, а затем используя профиль Zombies с инструментами. Затем я дойду до того момента, когда мое приложение выйдет из строя, а Instruments сообщит мне о сообщении, отправленном на освобожденный экземпляр. Все идет нормально.

Он очень хорошо показывает мне, где библиотеки, такие как UIKit, освобождают и сохраняют указатель на мой объект, но он не показывает мне, где мой собственный код делает это. Он также не отображает истинный счетчик ссылок. К тому моменту, когда Инструменты говорят, что счетчик ссылок равен 1, счетчик ссылок фактически равен 8 согласно распечатке счетчика ссылок в gdb.

Я исследовал возможность того, что инструменты каким-то образом фильтруют выход, но, похоже, я записываю каждый релиз и сохраняю событие. Это абсолютно необходимо в моем приложении, потому что мой диспетчер представлений сразу же освобождается после отображения, а это означает, что попытка сделать что-либо, что отправит сообщение контроллеру, приведет к его краху.

После размещения точки останова в методе dealloc я обнаружил, что мой объект действительно освобождается циклом события, так что это не случай вызова изгоев для dealloc чем-то другим.

+2

Сообщение код где вы создают экземпляр ViewController. –

ответ

1

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

+0

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

+0

Неужели два номера должны совпадать? Разве инструменты не видят выпуски и сохраняются внутри структуры Apple? И знаете ли вы, почему Instruments не регистрирует вызовы, которые мое программное обеспечение делает для выпуска и сохранения? –

+0

Я решил это через несколько часов, но забыл обновить. Получается, что на самом деле я установил, что владелец моего файла был моим обычным ViewController, а также установил TableViewController в nib, чтобы быть тем же самым ViewController, отсюда и моя путаница. Это привело к созданию двух экземпляров одного и того же ViewController; один из которых был быстро съеден в следующий раз, когда цикл событий запустился. Все действия в пользовательском интерфейсе, однако, были привязаны к этому теперь освобожденному экземпляру, следовательно, к сбою. Спасибо за ваше время в чтении и ответе на мой вопрос и наслаждайтесь вкусной репутацией. –

0
  1. Нажмите на (I) слева от распределения-Graph
  2. Набор "счетчики ссылок Запись"
  3. Вы сделали;)

Activate reference count

Смежные вопросы