Отладка циркуляра сохраняется в ARC без инструментов - PullRequest
1 голос
/ 13 марта 2012

В эпоху, предшествующую ARC, я мог переопределить сохранение и освобождение и записать трассировку стека, а затем легко найти место, где хранится мой объект, и не должен.

Теперь это запрещено, и иногда запуск инструментов невозможен (например, происходит сбой, как только я пытаюсь запустить приложение на устройстве, и ошибка не воспроизводится в симуляторе).

Есть предложения, как это можно сделать в ARC без инструментов?

Ответы [ 2 ]

2 голосов
/ 15 июня 2012

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

При использовании ARC компилятор не позволит вам запросить retainCount, и он даже достаточно умен, чтобы помешать вам выполнять executeSelector: @selector (retainCount). Однако я не сдался и пошел еще дальше, чтобы получить доступ к этому полезному индикатору отладки.

[anInstance performSelector:NSSelectorFromString(@"retainCount")];

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

Я, вероятно, собираюсь отказаться от этого, но я играю с еще более хитрой (читай: уродливой) техникой, чтобы получить стеки. Основная идея состоит в том, чтобы «расширить» метод retain с помощью времени выполнения target-c с помощью class_addMethod () или method_setImplementation. Я честно предупрежу, что пока у меня мало надежды на то, что я заработаю, и скоро я могу просто вернуться к более частым журналам вышеупомянутого вызова executeSelector.

Удачи!

edit С тех пор, как я написал это, я обнаружил основные функции ядра:

NSLog("RetainCount: %ld", (CFGetRetainCount((__bridge CFTypeRef) anInstance));

Что может не сработать во всех случаях, но в большинстве точно. См. Документация .

0 голосов
/ 13 марта 2012

Вы пытались установить точку останова исключения? Панель точек останова, «+» внизу слева, «Добавить точку останова ...», «Готово» Если вы можете выделить исключение в строке, вы сможете определить, какой объект ведет себя неправильно. Надеюсь, это поможет:)

...