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ę.
6 answers
print(__FUNCTION__) // Swift
NSLog(@"%@", NSStringFromSelector(_cmd)); // Objective-C
Swift 3 i wyżej
print(#function)
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__);
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
- podaj argument implicit dla selektora bieżącej metody:
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.
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
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
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 ()"
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