Obecnie sami definiujemy rozszerzony mechanizm dziennika, aby wydrukować 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, kiedy dzwonię do NCLog (@ "Hello world"); Wynik będzie:
<ApplicationDelegate:10>Hello world
Teraz chcę również wylogować się z nazwy metody, takiej jak:
<ApplicationDelegate:applicationDidFinishLaunching:10>Hello world
Dzięki temu 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ć, wylogowując się.
objective-c
c
iphone
debugging
vodkhang
źródło
źródło
iPhone
projekcie zrobiłem to ręcznie. Chciałbym zobaczyć odpowiedź na to pytanie.Odpowiedzi:
Swift 3 i nowsze
źródło
NSLog(@"%@", NSStringFromSelector(_cmd))
, jeśli zamierzasz używać_cmd
, ponieważ AFAIK Apple deklaruje_cmd
jako typSEL
, a nie ciąg znaków C. To, że zdarzyło się, że jest zaimplementowany jako ciąg C (w obecnych wersjach Mac OS X i iPhone OS), nie oznacza, że powinieneś go używać w ten sposób, ponieważ Apple może to zmienić w aktualizacji systemu operacyjnego.[self doSomething:arg1 somethingElse:arg2]
get konwertowane do wywołania funkcji Cobjc_msgSend(self, "doSomething:somethingElse:, arg1, arg2);
. Drugi parametrobjc_msgSend()
zajmuje achar*
. Pamiętaj, że ponieważ środowisko wykonawcze Objective-C jest dynamiczne, w rzeczywistości używa tabeli odnośników, aby dowiedzieć się, którą metodę wywołać, dlatego znak * jest wygodny, ponieważ metody są reprezentowane jako łańcuchy w tabeli odnośników.print("\(#function)")
Aby technicznie odpowiedzieć na swoje pytanie, chcesz:
Możesz też zrobić:
źródło
__FUNCTION__
i jego całkiem odpowiednik są również dostępne w funkcjach C.__FUNCTION__
zawiera również nazwę klasytl; dr
Detale
Firma Apple ma stronę z technicznymi pytaniami i odpowiedziami: QA1669 - Jak mogę dodać informacje kontekstowe - takie jak bieżąca metoda lub numer wiersza - do moich wyciągów logowania?
Aby pomóc w logowaniu:
_cmd
Jak wskazały inne odpowiedzi, aby uzyskać tylko nazwę bieżącej metody, zadzwoń:
Aby uzyskać aktualną nazwę metody i numer bieżącego wiersza, użyj tych dwóch makr
__func__
i__LINE__
jak widać tutaj:Kolejny przykład… Fragmenty kodu, które trzymam w bibliotece fragmentów kodu Xcode:
… I TRACE zamiast ERROR…
… I dłuższy, wykorzystujący miękki opis z przekazaniem wartości (
[rows count]
)…Makra preprocesora do rejestrowania
Zwróć uwagę na użycie pary znaków podkreślenia po obu stronach makra.
Wyrażenia do logowania
Struktury rejestrowania
Niektóre struktury rejestrowania mogą również pomóc w uzyskaniu aktualnej metody lub numeru linii. Nie jestem pewien, ponieważ korzystałem ze świetnego mechanizmu rejestrowania w Javie ( SLF4J + LogBack ), ale nie w Cocoa.
Zobacz to pytanie, aby uzyskać linki do różnych struktur rejestrowania Cocoa.
Nazwa selektora
Jeśli masz zmienną selektora ( SEL ), możesz wydrukować nazwę jej metody („komunikat”) na dwa sposoby, jak opisano w tym poście na blogu Codec :
NSLog(@"%@", NSStringFromSelector(selector) );
NSLog(@"%s", selector );
Te informacje pochodzą z połączonej strony dokumentów Apple z dnia 19.07.2013 r. Ta strona była ostatnio aktualizowana 2011-10-04.
źródło
sel_getName(SEL)
ponieważ SEL jest typem nieprzezroczystym i nie zawsze może byćchar *
źródło
W rzeczywistości jest to tak proste, jak:
Z jakiegoś powodu iOS pozwala na przekazywanie _cmd jako dosłownego znaku bez nawet ostrzeżenia o kompilacji. Kto wie
źródło
W Swift 4:
func test () {
}
test () // wydrukuj wartość "test ()"
źródło