NSLog имя метода с Objective-C в iPhone - PullRequest
146 голосов
/ 05 мая 2010

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

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

Ответы [ 6 ]

252 голосов
/ 05 мая 2010
print(__FUNCTION__) // Swift
NSLog(@"%@", NSStringFromSelector(_cmd)); // Objective-C

Swift 3 и выше

print(#function)
158 голосов
/ 05 мая 2010

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

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

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

NSLog(@"%s", __PRETTY_FUNCTION__);
78 голосов
/ 05 января 2013

ТЛ; др

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

Подробнее

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

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

  • Препроцессор C предоставляет несколько макросов .
  • 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__ );

Макросы препроцессора для ведения журнала

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

| Macro                | Format   | Description
  __func__               %s         Current function signature
  __LINE__               %d         Current line number
  __FILE__               %s         Full path to source file
  __PRETTY_FUNCTION__    %s         Like __func__, but includes verbose
                                    type information in C++ code. 

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

| Expression                       | Format   | Description
  NSStringFromSelector(_cmd)         %@         Name of the current selector
  NSStringFromClass([self class])    %@         Current object's class name
  [[NSString                         %@         Source code file name
    stringWithUTF8String:__FILE__]   
    lastPathComponent] 
  [NSThread callStackSymbols]        %@         NSArray of stack trace

Каркасные каркасы

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

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

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

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

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

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

8 голосов
/ 25 октября 2013
NSLog(@"%@", NSStringFromSelector(_cmd)); // Objective-C
print(__FUNCTION__) // Swift
0 голосов
/ 12 октября 2017

В Swift 4:

func test () {

print(#function)

}

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

0 голосов
/ 04 марта 2016

Это на самом деле так же просто, как:

printf(_cmd);

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

...