В настоящее время мы сами определяем расширенный механизм журнала, чтобы распечатать имя класса и номер строки исходного кода журнала.
#define NCLog(s, ...) NSLog(@"<%@:%d> %@", [[NSString stringWithUTF8String:__FILE__] lastPathComponent], \
__LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__])
Например, когда я звоню NCLog (@ "Hello world"); Выход будет:
<ApplicationDelegate:10>Hello world
Теперь я также хочу выйти из имени метода, как:
<ApplicationDelegate:applicationDidFinishLaunching:10>Hello world
Таким образом, это сделает нашу отладку проще, когда мы сможем узнать, какой метод вызывается. Я знаю, что у нас также есть отладчик Xcode, но иногда я также хочу выполнить отладку, выйдя из системы.
objective-c
c
iphone
debugging
vodkhang
источник
источник
iPhone
проекте я фактически делал это вручную. Хотелось бы увидеть ответ на это.Ответы:
Свифт 3 и выше
источник
NSLog(@"%@", NSStringFromSelector(_cmd))
, если вы собираетесь использовать_cmd
, так как AFAIK Apple объявляет_cmd
как типSEL
, а не C-строку. Тот факт, что он реализован в виде C-строки (в текущих версиях Mac OS X и iPhone OS), не означает, что вы должны использовать его таким образом, поскольку Apple может изменить его в обновлении ОС.[self doSomething:arg1 somethingElse:arg2]
преобразуется в вызов функции Cobjc_msgSend(self, "doSomething:somethingElse:, arg1, arg2);
. Второй параметрobjc_msgSend()
принимаетchar*
. Помните, что поскольку среда выполнения Objective C является динамической, она фактически использует таблицу поиска, чтобы выяснить, какой метод для какого класса вызывать, так что char * удобен, поскольку методы представлены в виде строки в таблице поиска.print("\(#function)")
Чтобы технически ответить на ваш вопрос, вы хотите:
Или вы также можете сделать:
источник
__FUNCTION__
и его довольно эквивалентно также доступны в C-функциях.__FUNCTION__
также включает в себя название классаТЛ; др
подробности
У Apple есть техническая страница вопросов и ответов : QA1669 - Как я могу добавить контекстную информацию - такую как текущий метод или номер строки - в свои операторы регистрации?
Чтобы помочь с регистрацией:
_cmd
Как указано в других ответах, чтобы просто получить имя текущего метода, вызовите:
Чтобы получить текущее имя методы и номер текущей строки, используйте эти два макрос
__func__
и ,__LINE__
как показано здесь:Другой пример ... Фрагменты кода, которые я храню в библиотеке фрагментов кода Xcode:
... и TRACE вместо ERROR ...
… И более длинный, использующий мягкое описание, передающее значение (
[rows count]
)…Макросы препроцессора для регистрации
Обратите внимание на использование пары символов подчеркивания по обе стороны макроса.
Выражения для регистрации
Фреймворки
Некоторые каркасы журналирования также могут помочь в получении текущего метода или номера строки. Я не уверен, так как я использовал отличный каркас для ведения журналов в Java ( SLF4J + LogBack ), но не в Какао.
Смотрите этот вопрос для ссылок на различные каркасы ведения журнала Какао.
Имя селектора
Если у вас есть переменная Selector (а SEL ), вы можете распечатать его имя метода ( «сообщение») в одном из двух способов, описанных этим Codec блоге :
NSLog(@"%@", NSStringFromSelector(selector) );
NSLog(@"%s", selector );
Эта информация взята со ссылочной страницы Apple Doc по состоянию на 2013-07-19. Эта страница была в последний раз обновлена 2011-10-04.
источник
sel_getName(SEL)
поскольку SEL является непрозрачным типом и не всегда может бытьchar *
источник
На самом деле это так же просто, как:
По какой-то причине iOS позволяет передавать _cmd как буквенный символ даже без предупреждения компиляции. Кто знает
источник
В Swift 4:
func test () {
}
test () // вывести значение "test ()"
источник