it-swarm.com.ru

NSLog имя метода с Objective-C в iPhone

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

#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, но иногда я также хочу выполнить отладку, выйдя из системы.

142
vodkhang
print(__FUNCTION__) // Swift
NSLog(@"%@", NSStringFromSelector(_cmd)); // Objective-C

Swift 3 и выше

print(#function)
247
drawnonward

Чтобы технически ответить на ваш вопрос, вы хотите:

NSLog(@"<%@:%@:%d>", NSStringFromClass([self class]), NSStringFromSelector(_cmd), __LINE__);

Или вы также можете сделать:

NSLog(@"%s", __PRETTY_FUNCTION__);
157
Dave DeLong

тЛ; др

NSLog( @"ERROR %@ METHOD %s:%d ", @"DescriptionGoesHere", __func__, __LINE__ );

Подробности

У Apple есть техническая страница вопросов и ответов: QA1669 - Как я могу добавить контекстную информацию - например, текущий метод или номер строки - в свои операторы регистрации?

Чтобы помочь с регистрацией:

  • Препроцессор C предоставляет несколько macros
  • Objective-C предоставляет выражения (методы) .
    • Передайте неявный аргумент для селектора текущего метода: _cmd

Как указано в других ответах, чтобы просто получить имя текущего метода, вызовите:

NSStringFromSelector(_cmd)

Чтобы получить имя текущего метода и текущий номер строки, используйте эти два макроса __func__ и __LINE__, как показано здесь:

NSLog(@"%s:%d someObject=%@", __func__, __LINE__, someObject);

Другой пример ... Фрагменты кода, которые я храню в библиотеке фрагментов кода Xcode:

NSLog( @"ERROR %@ METHOD %s:%d ", @"DescriptionGoesHere", __func__, __LINE__ );

... и TRACE вместо ERROR ...

NSLog( @"TRACE %@ METHOD %s:%d ", @"DescriptionGoesHere", __func__, __LINE__ );

… И более длинный, использующий мягко закодированное описание, передающее значение ([rows count])…

NSLog( @"TRACE %@ METHOD %s:%d.", [NSString stringWithFormat:@"'Table of Contents.txt' file's count of Linefeed-delimited rows: %u.", [rows count]] , __func__, __LINE__ );

Макросы препроцессора для регистрации

Обратите внимание на использование символа символа подчеркивания по обе стороны макроса.

 | Макро | Формат | Описание
 __func__% s Текущая подпись функции 
 __LINE__% d Текущий номер строки 
 __FILE__% s Полный путь к исходному файлу 
 __PRETTY_FUNCTION__% s Как и __func__, но содержит подробный 
 введите информацию в коде C++. 

Выражения для регистрации

 | Выражение | Формат | Описание
 NSStringFromSelector (_cmd)% @ Имя текущего селектора 
 NSStringFromClass ([self class])% @ Имя класса текущего объекта 
 [[NSString% @ Имя файла исходного кода 
 stringWithUTF8String: __ FILE__] 
 lastPathComponent] 
 [NSThread callStackSymbols]% @ NSArray трассировки стека 

Фреймворки

Некоторые каркасы журналирования также могут помочь в получении текущего метода или номера строки. Я не уверен, так как я использовал отличную инфраструктуру ведения журналов в Java ( SLF4J + LogBack ), но не в Cocoa.

Смотрите этот вопрос для ссылок на различные каркасы ведения журналов Какао.

Имя селектора

Если у вас есть переменная Selector (a SEL ), вы можете напечатать имя ее метода («message») одним из двух способов, как описано в этом Codec _ ​​ сообщение в блоге :

  • Используя Objective-C вызов NSStringFromSelector :
    NSLog(@"%@", NSStringFromSelector(selector) );
  • Используя прямой C:
    NSLog(@"%s", selector );

Эта информация взята со ссылочной страницы Apple Doc по состоянию на 2013-07-19. Эта страница была в последний раз обновлена ​​2011-10-04.

77
Basil Bourque
NSLog(@"%@", NSStringFromSelector(_cmd)); // Objective-C
print(__FUNCTION__) // Swift
8
Huynh Inc

На самом деле это так же просто, как:

printf(_cmd);

По какой-то причине iOS позволяет передавать _cmd как буквенный символ даже без предупреждения компиляции. Кто знает

0
Albert Renshaw

В Swift 4:

func test () {

print(#function)

}

test () // вывести значение "test ()"

0
Ankit garg