1

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

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

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

ответ

2

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

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

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

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

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

Удачи!

редактировать Так как я писал это, я обнаружил функции ядра Foundation:

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

которые не могут работать в всех случаях, но большинство, конечно. См. The documentation.

+0

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

+0

Прохладный. Я также добавил примечание в своем ответе о CFGetRetainCount, которое я только недавно обнаружил. –

0

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

+0

Не исключение, это логическая ошибка из-за объекта, который должен был быть удален, но остается в живых. – yonix