Robię prezentację na temat debugowania w Xcode i chciałbym uzyskać więcej informacji na temat wydajnego używania NSLog.
W szczególności mam dwa pytania:
- czy istnieje sposób na łatwe NSLogowanie nazwy / numeru wiersza bieżącej metody?
- Czy istnieje sposób na łatwe „wyłączenie” wszystkich NSLogów przed skompilowaniem kodu wersji?
objective-c
cocoa
cocoa-touch
xcode
nslog
wodza
źródło
źródło
Odpowiedzi:
Oto kilka przydatnych makr wokół NSLog, których często używam:
Makro DLog służy do wyświetlania danych wyjściowych tylko wtedy, gdy ustawiona jest zmienna DEBUG (-DDEBUG w flagach C projektów dla potwierdzenia debugowania).
ALog zawsze wyświetla tekst (jak zwykły NSLog).
Dane wyjściowe (np. ALog (@ „Hello world”)) będą wyglądać następująco:
źródło
(@"%s [Line %d] " fmt)
powodujefmt
to dołączenie do ciągu kontrolnego? Nie widziałem tej składni innej niż makro debugowania.Wziąłem
DLog
iALog
z góry, i dodał,ULog
co podnosiUIAlertView
wiadomość.Podsumowując:
DLog
wyświetli tak jakNSLog
tylko wtedy, gdy ustawiona jest zmienna DEBUGALog
zawsze będzie wyświetlać jakNSLog
ULog
pokażeUIAlertView
tylko, gdy ustawiona jest zmienna DEBUGTak to wygląda:
+1 Diederik
źródło
DLog
instrukcji. Jest to przydatne, ponieważ jeśli tak zrobiłeś, w kompilacjach wersjiDLog
jest skompilowany do zera, a w kodzie pozostanie ci wiszący średnik. To nie jest błąd, ale może wygenerować ostrzeżenie, w zależności od ustawień, jeśli nastąpi po innym średniku.Wyświetla nazwę pliku, numer linii i nazwę funkcji:
__FUNCTION__
w C ++ pokazuje zniekształconą nazwę__PRETTY_FUNCTION__
pokazuje ładną nazwę funkcji, w kakao wyglądają tak samo.Nie jestem pewien, jaki jest właściwy sposób wyłączenia NSLog, zrobiłem:
I nie pojawił się żaden wynik rejestrowania, ale nie wiem, czy ma to jakieś skutki uboczne.
źródło
Oto jedna duża kolekcja stałych debugowania, których używamy. Cieszyć się.
źródło
Istnieje nowa sztuczka, której nie daje odpowiedź. Można użyć
printf
zamiastNSLog
. To da ci czysty log:Z
NSLog
ciebie dostać takie rzeczy:Ale z
printf
tobą otrzymujesz tylko:Użyj tego kodu
źródło
Moja odpowiedź na to pytanie może pomóc, wygląda na to, że jest podobna do tej, którą ugotował Diederik. Możesz także zastąpić wywołanie
NSLog()
statycznym wystąpieniem własnej niestandardowej klasy rejestrowania, w ten sposób możesz dodać flagę priorytetu dla komunikatów debugowania / ostrzeżeń / błędów, wysyłać wiadomości do pliku lub bazy danych, a także do konsoli lub właściwie cokolwiek jeszcze możesz wymyślić.źródło
%s
specyfikatora formatu, który Apple stara się wycofać, i uniknąłeś-Wcstring-format-directive
ostrzeżenia Clanga nowo wprowadzonego w 2015 roku.Wyłączenie wszystkich NSLogów, dla osób uczulonych na MAKRO, oto coś, co możesz skompilować:
I używaj go prawie jak NSLog:
Z tego bloga: https://whackylabs.com/logging/ios/2011/01/19/ios-moving-in-and-out-of-nslogs/
źródło
W celu uzupełnienia powyższych odpowiedzi użyteczne może być użycie zamiennika NSLog w niektórych sytuacjach, szczególnie podczas debugowania. Na przykład pozbywanie się daty i informacji o nazwie / identyfikatorze procesu w każdej linii może sprawić, że dane wyjściowe będą bardziej czytelne i szybciej się uruchomią.
Poniższy link zawiera całkiem przydatną amunicję, dzięki której proste logowanie jest znacznie przyjemniejsze.
http://cocoaheads.byu.edu/wiki/a-different-nslog
źródło
Łatwo jest zmienić istniejące listy NSLog, aby wyświetlały numer linii i klasę, z której są wywoływane. Dodaj jeden wiersz kodu do pliku prefiksu:
źródło
To jest na przykład proste
Dane wyjściowe: - [AppDelegate applicationWillEnterForeground:]
źródło
opierając się na powyższych odpowiedziach, oto co plagiatowałem i wymyśliłem. Dodano także rejestrowanie pamięci.
źródło
Nowy dodatek do DLog. Zamiast całkowicie usuwać debugowanie z wydanej aplikacji, wyłącz ją. Gdy użytkownik ma problemy, które wymagałyby debugowania, po prostu powiedz, jak włączyć debugowanie w wydanej aplikacji i zażądaj danych dziennika za pośrednictwem poczty e-mail.
Krótka wersja: utwórz zmienną globalną (tak, leniwe i proste rozwiązanie) i zmodyfikuj DLog w następujący sposób:
Dłuższa odpowiedź w Jomnius iLessons iLearned: Jak wykonywać dynamiczne rejestrowanie debugowania w wydanej aplikacji
źródło
Od pewnego czasu korzystam z witryny makr przyjętych z kilku powyższych. Skupiam się na logowaniu w konsoli, z naciskiem na kontrolowaną i filtrowaną gadatliwość ; jeśli nie masz nic przeciwko wielu wierszom dziennika, ale chcesz łatwo włączać i wyłączać ich partie, może to być przydatne.
Po pierwsze, opcjonalnie zastępuję NSLog printf, jak opisano powyżej przez @Rodrigo
Następnie włączam lub wyłączam logowanie.
W głównym bloku zdefiniuj różne kategorie odpowiadające modułom w swojej aplikacji. Określ także poziom rejestrowania , powyżej którego rejestrowanie połączeń nie będzie wywoływane. Następnie zdefiniuj różne smaki wyników NSLog
Zatem przy obecnych ustawieniach dla kLOGIFcategory i kLOGIFdetailLTEQ, połączenie takie jak
wydrukuje, ale nie będzie
nie będzie
Jeśli chcesz zastąpić ustawienia dla pojedynczego połączenia dziennika, użyj poziomu ujemnego:
Uważam, że kilka dodatkowych znaków wpisywania każdej linii jest wartych, jak mogę
Jestem pewien, że wielu uzna to za przesadę, ale na wypadek, gdyby ktoś uznał, że pasuje to do ich celów ...
źródło