2011-06-20 11 views
7

Przeczytałem ten wpis: what happens to NSLog info when running on a device?NSLog na urządzeniu, czy to jest problem, czy muszę go usunąć?

... ale zastanawiasz się, czy NSLog jest problemem podczas dystrybucji aplikacji, takich jak zapełnianie pamięci czy coś takiego? Interesuje mnie tylko to, gdy testuję spójność moich danych wejściowych z bazą danych.

Powodem jest to, że mam kontrolę NSLog, gdy ładuję dane do mojej bazy danych w symulatorze. Mogę go usunąć po przesłaniu, ale byłoby dobrze, gdybym nie musiał?

Odpowiedz

7

Powinieneś go usunąć. Na przykład, jeśli logujesz zawartość UITableViewCell (w -tableView:cellForRowAtIndexPath:), może to mieć duże znaczenie pod względem wydajności, szczególnie w przypadku wolniejszego sprzętu.

Użyj makra, aby zachować wyjście NSLog w trybie debugowania, ale usuń go z trybu zwolnienia. Przykład można znaleźć na następującej stronie: http://iphoneincubator.com/blog/debugging/the-evolution-of-a-replacement-for-nslog

0

Jedynym prawdziwym powodem do usunięcia wpisów NSLog jest zaoszczędzenie na zużyciu pamięci poprzez uruchomienie niepotrzebnego kodu, ale jeśli nie dodajesz danych, to nie powinno to być zbyt dużym problemem. Ponadto, jeśli użytkownik ma problem, taki jak awaria aplikacji, itp. Można wysyłać protokoły, które programista może przeczytać w celu wyjaśnienia przyczyny awarii. Jeśli ładujesz serwer NSlog z dużą ilością niepotrzebnych danych, może to być kłopotliwe w późniejszym terminie, jeśli musisz przejrzeć wspomniany dziennik, aby znaleźć problem użytkownika w celu rozwiązania problemu.

Ostatecznie, nie martwię się zbytnio o ich usunięcie. To i tak moje 2 centy.

+0

ja generalnie zgadzam się z tym, chociaż w sytuacjach, w których wymagana jest 100% wydajność (to zapętlenie poprzez duży zbiór), a następnie prawdopodobnie chcesz usunąć NSLogs jak tam jest hitem wydajność podczas logowania. W ogólnej sytuacji jednak tego nie zauważysz. – sosborn

3

Log w urządzeniu utrzymuje około godziny danych, nawet aplikacje Apple rejestrują kilka rzeczy. Tak więc ogólnie dopuszczalne jest posiadanie znaczących wyników w dzienniku.

Ale ponieważ rejestrowanie jest operacją na dysku, może się okazać, że nadmierne logowanie spowalnia aplikację, ponieważ zapis blokuje główny wątek (= UI) przez krótki czas dla każdego dziennika NSLog.

Z tego powodu należy rejestrować tylko te informacje, które zawierają więcej informacji, jeśli błędy występują w aplikacji, aby ułatwić znalezienie problemu.

5

Używam zestawu makr w moim pliku pch, które są bardzo przydatne do tego.

Aby uzyskać szczegółowe informacje, patrz http://www.cimgf.com/2010/05/02/my-current-prefix-pch-file/.

#ifdef DEBUG 
    #define DLog(...) NSLog(@"%s %@", __PRETTY_FUNCTION__, [NSString stringWithFormat:__VA_ARGS__]) 
    #define ALog(...) [[NSAssertionHandler currentHandler] handleFailureInFunction:[NSString stringWithCString:__PRETTY_FUNCTION__ encoding:NSUTF8StringEncoding] file:[NSString stringWithCString:__FILE__ encoding:NSUTF8StringEncoding] lineNumber:__LINE__ description:__VA_ARGS__] 
#else 
    #define DLog(...) do { } while (0) 
    #ifndef NS_BLOCK_ASSERTIONS 
    #define NS_BLOCK_ASSERTIONS 
    #endif 
    #define ALog(...) NSLog(@"%s %@", __PRETTY_FUNCTION__, [NSString stringWithFormat:__VA_ARGS__]) 
#endif 

#define ZAssert(condition, ...) do { if (!(condition)) { ALog(__VA_ARGS__); }} while(0) 
1

rozważyć przejście na cocoalumberjack, jest to zamiennik dla NSLog i ma znacznie więcej przydatnych funkcjonalności i lepszą wydajność.

Jest podobny w koncepcji do innych popularnych ram rejestrowania takich jak log4j, ale został zaprojektowany specjalnie dla Objective-C i korzysta z funkcji, takich jak wielowątkowości, Grand Central Dispatch (jeśli są dostępne), lockless atomowej operacje i dynamiczny charakter środowiska wykonawczego obiektu-c.

Powiązane problemy