#iphone #objective-c #ios #nslog
#iPhone #objective-c #iOS #nslog
Вопрос:
Хорошо, у меня есть требование установить точку останова, которая получает «попадание» только тогда, когда метод вызывается (или не вызывается) определенным объектом и / или селектором
самый простой способ, который я могу придумать, это сделать, если бы существовал какой-нибудь макрос компилятора (например, _cmd), который разворачивает стек и возвращает идентификатор и селектор непосредственного вызывающего текущего метода.
например, предполагая, что основными макросами были _cmd_caller_id и _cmd_caller_sel) —
if ( (_cmd_caller_id == self) amp;amp; (_cmd_caller_sel != @selector(some_method:signature:) ) {
NSLog(@"called by %@ - hitting breakpoint",NSStringFromSelector(_cmd_caller_sel));
}
(и вы бы поставили точку останова в строке, содержащей NSLog(…); );
причина в том, что у меня есть метод, который вызывается много раз, и мне нужно иметь возможность настроить более сложный набор условий, чем я описал выше, чтобы установить ловушку, чтобы определить, какой метод вызывает метод-нарушитель и когда.
Ответ №1:
Установите свою точку останова на вызывающем сайте с условием для точки останова (например, self == что угодно)
Комментарии:
1. да, я решил эту проблему другим способом (работая в обратном направлении). однако в некоторых случаях у вас нет источника для вызывающего сайта — я пытался отследить, откуда исходило ложное сохранение. было бы неплохо иметь возможность разматывать стек, но я думаю, что это на другой день.
2. Если вы хотите выяснить, откуда берутся дополнительные сохранения, используйте инструменты, а не GDB.
3. обычно я бы согласился с вами, однако я работаю над чем-то, что требует анализа в реальном времени. т. Е. снижение производительности инструментов неприемлемо. (т. Е. я выполняю много числовых операций с сэмплами звука в реальном времени перед воспроизведением)