NSLog nazwa metody z objective-C W iPhone

Obecnie definiujemy sobie Rozszerzony mechanizm logu, który drukuje nazwę klasy i numer linii źródłowej dziennika.

#define NCLog(s, ...) NSLog(@"<%@:%d> %@", [[NSString stringWithUTF8String:__FILE__] lastPathComponent], \
    __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__])

Na przykład, gdy wywołuję NCLog (@"Hello world"); Wyjście będzie:

<ApplicationDelegate:10>Hello world

Teraz chcę również wylogować nazwę metody w stylu:

<ApplicationDelegate:applicationDidFinishLaunching:10>Hello world

Więc to sprawi, że nasze debugowanie stanie się łatwiejsze, gdy będziemy wiedzieć, która metoda jest wywoływana. Wiem, że mamy również debugger Xcode, ale czasami chcę również debugować przez wylogowanie się.

Author: TylerH, 2010-05-05

6 answers

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

Swift 3 i wyżej

print(#function)
 242
Author: drawnonward,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-29 05:26:25

Aby technicznie odpowiedzieć na twoje pytanie, chcesz:

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

Lub możesz też zrobić:

NSLog(@"%s", __PRETTY_FUNCTION__);
 156
Author: Dave DeLong,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-05 03:17:55

Tl;dr

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

Szczegóły

Apple ma stronę z pytaniami technicznymi: QA1669 - jak Mogę dodać informacje kontekstowe - takie jak bieżąca metoda lub numer linii - do moich instrukcji logowania?

Aby pomóc w logowaniu:

  • preprocesor C dostarcza kilka makr .
  • Objective-C dostarcza wyrażenia (metody).
    • podaj argument implicit dla selektora bieżącej metody: _cmd

Jak wskazały inne odpowiedzi, aby uzyskać tylko nazwę bieżącej metody, zadzwoń:

NSStringFromSelector(_cmd)

Aby uzyskać bieżącą nazwę metody i numer linii, użyj tych dwóch makr __func__ i __LINE__, Jak pokazano tutaj:

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

Kolejny przykład ... fragmenty kodu przechowuję w Bibliotece fragmentów kodu Xcode:

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

...i TRACE zamiast błędu...

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

...i dłuższą, używając miękkiego opisu przekazującego wartość ([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__ );

Makra preprocesora do logowania

Zwróć uwagę na użycie pary znaków podkreślenia wokół obu stron makra.

| 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. 

Wyrażenia do logowania

| 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

Ramy Logowania

Niektóre frameworki logowania mogą również pomóc w pobraniu bieżącej metody lub numeru linii. Nie jestem pewien, ponieważ używałem świetnego frameworka logowania w Javie (SLF4J + LogBack ), ale nie kakao.

Zobacz to pytanie dotyczące linków do różnych frameworków logowania Cocoa.

Nazwa selektora

Jeśli masz zmienną selektora (a SEL), możesz wydrukować jej nazwę metody ("message") na jeden z dwóch sposobów, jak opisano w tym kodeku post na blogu :

  • użycie wywołania Objective-C do NSStringFromSelector:
    NSLog(@"%@", NSStringFromSelector(selector) );
  • używając prostej C:
    NSLog(@"%s", selector );

Informacje zaczerpnięte z linked Stan na 2013-07-19.. Tę stronę ostatnio zmodyfikowano 2011-10-04.

 74
Author: Basil Bourque,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:46:34
NSLog(@"%@", NSStringFromSelector(_cmd)); // Objective-C
print(__FUNCTION__) // Swift
 8
Author: Huynh Inc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-03 03:52:59

To właściwie tak proste jak:

printf(_cmd);

Z jakiegoś powodu iOS pozwala na przekazanie _cmd jako literalnego znaku graficznego bez ostrzeżenia kompilacji. Kto wie

 0
Author: Albert Renshaw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-03 21:37:30

W Swift 4:

Func test () {

print(#function)

}

Test () / / wyświetla wartość"test ()"

 0
Author: Ankit garg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-12 19:39:35