2009-11-04 5 views
15

Z jakiegoś powodu, podczas mojego cyklu rozwoju, znajduję się usuwając instrukcje NSLog, które wstawiłem, aby pomóc w debugowaniu. Naprawdę nie wiem, dlaczego mam ten nawyk, po prostu to robię.Czy podczas budowania aplikacji do dystrybucji istnieje jakiekolwiek niebezpieczeństwo opuszczenia instrukcji NSLog?

Przy okazji, podczas pracy odkryję, że napotkam problem, który miałem wcześniej, a następnie zakończono ponownie, dodając starą instrukcję NSLog. A następnie usunięcie go później.

Czy istnieje jakiś dobry powód, aby usunąć instrukcje NSLog? Z mojego doświadczenia wynika, że ​​opuszczenie jednego lub dwóch nie spowodowało odrzucenia aplikacji. A ponieważ, o ile mi wiadomo, nie logują się nigdzie, gdy aplikacja jest w dystrybucji (proszę poprawić mnie, jeśli się mylę), to nie wydaje się, żeby cokolwiek szkodziły. Czy istnieje uderzenie wydajności, o które powinienem się martwić?

Odpowiedz

21

Co mogę zrobić, to dodać makro, które rejestruje tylko wtedy, gdy jestem w trybie debugowania. Umieścić to w pliku

#ifdef DEBUG 
#define DebugLog(s, ...) NSLog(@"<%p %@:%d (%@)> %@", self, [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__, NSStringFromSelector(_cmd), [NSString stringWithFormat:(s), ##__VA_ARGS__]) 
#else 
#define DebugLog(s, ...) 
#endif 

jako bonus do regularnego dziennika <APP_NAME>_Prefix.pch, można uzyskać nazwę pliku, nazwę metody, a numer linii.

Następnie w informacjach o projekcie dodaj go tylko w wersji do debugowania. To idzie w User-defined sekcjach pod GCC_PREPROCESSOR_DEFINITIONS:

DEBUG

Następnie zastąpić dowolną z NSLog na masz w projekcie z DebugLog (zajmuje te same argumenty jak NSLog) i nie trzeba się martwić o zwolnieniu instrukcje debugowania na żywo.

W odpowiedzi na twoje pytanie, logowanie może spowolnić działanie aplikacji i jeśli nie potrzebujesz ich do pomocy w debugowaniu w środowisku naturalnym, zostawiłbym je.

+0

Dzięki Coney, jakby w następstwie następnie - gdy mówisz mogę używać rejestrowanie debugowania dla pomocy w naturze, o ile Wiedziałem NSLog rzeczywistości nie robić nic w rozproszonej aplikacji. Jedyne dzienniki, które mogę uzyskać ze stanu dzikiego, to raporty o awariach Apple, prawda? Oczywiście, pytam o uzyskanie informacji o logowaniu bez potrzeby stosowania własnego kodu, aby wysłać do mnie pliki logów lub coś w tym stylu. – bpapa

+0

Instrukcje NSLog są drukowane na konsoli. Jeśli masz nieprzyjemny błąd i współpracujący użytkownik lub użytkownik/programista, możliwe jest pobieranie zawartości z dziennika. Apple domyślnie nie zbiera zawartości konsoli dla ciebie. – coneybeare

4

Jeśli masz dużo dzienników, , aplikacja może być wolniejsza. Logowanie do konsoli powoduje przetwarzanie w postaci .

Ukończenie odpowiedzi daje tutaj jedną dużą kolekcję stałych debugujących, których używamy. Cieszyć się.

// Uncomment the defitions to show additional info. 

// #define DEBUG 

// #define DEBUGWHERE_SHOWFULLINFO 

// #define DEBUG_SHOWLINES 
// #define DEBUG_SHOWFULLPATH 
// #define DEBUG_SHOWSEPARATORS 
// #define DEBUG_SHOWFULLINFO 


// Definition of DEBUG functions. Only work if DEBUG is defined. 
#ifdef DEBUG 

    #define debug_separator() NSLog(@"────────────────────────────────────────────────────────────────────────────"); 

    #ifdef DEBUG_SHOWSEPARATORS 
     #define debug_showSeparators() debug_separator(); 
    #else 
     #define debug_showSeparators() 
    #endif 

    /// /// /// ////// ///// 

    #ifdef DEBUG_SHOWFULLPATH 
     #define debug_whereFull() debug_showSeparators(); NSLog(@"Line:%d : %s : %s", __LINE__,__FILE__,__FUNCTION__); debug_showSeparators(); 
    #else 
     #define debug_whereFull() debug_showSeparators(); NSLog(@"Line:%d : %s : %s", __LINE__,[ [ [ [NSString alloc] initWithBytes:__FILE__ length:strlen(__FILE__) encoding:NSUTF8StringEncoding] lastPathComponent] UTF8String ] ,__FUNCTION__); debug_showSeparators(); 
    #endif 

    /// /// /// ////// ///// 

    #define debugExt(args,...) debug_separator(); debug_whereFull(); NSLog(args, ##__VA_ARGS__); debug_separator(); 

    /// /// /// ////// ///// Debug Print Macros 

    #ifdef DEBUG_SHOWFULLINFO 
     #define debug(args,...) debugExt(args, ##__VA_ARGS__); 
    #else 
     #ifdef DEBUG_SHOWLINES 
      #define debug(args,...) debug_showSeparators(); NSLog([ NSString stringWithFormat:@"Line:%d : %@", __LINE__, args ], ##__VA_ARGS__); debug_showSeparators(); 
     #else 
      #define debug(args,...) debug_showSeparators(); NSLog(args, ##__VA_ARGS__); debug_showSeparators(); 
     #endif 
    #endif 

    /// /// /// ////// ///// Debug Specific Types 

    #define debug_object(arg) debug(@"Object: %@", arg); 
    #define debug_int(arg) debug(@"integer: %i", arg); 
    #define debug_float(arg) debug(@"float: %f", arg); 
    #define debug_rect(arg) debug(@"CGRect (%f, %f, %f, %f)", arg.origin.x, arg.origin.y, arg.size.width, arg.size.height); 
    #define debug_point(arg) debug(@"CGPoint (%f, %f)", arg.x, arg.y); 
    #define debug_bool(arg) debug(@"Boolean: %@", (arg == YES ? @"YES" : @"NO")); 

    /// /// /// ////// ///// Debug Where Macros 

    #ifdef DEBUGWHERE_SHOWFULLINFO 
     #define debug_where() debug_whereFull(); 
    #else 
     #define debug_where() debug(@"%s",__FUNCTION__); 
    #endif 

    #define debug_where_separators() debug_separator(); debug_where(); debug_separator(); 

    /// /// /// ////// ///// 

#else 
    #define debug(args,...) 
    #define debug_separator() 
    #define debug_where() 
    #define debug_where_separators() 
    #define debug_whereFull() 
    #define debugExt(args,...) 
    #define debug_object(arg) 
    #define debug_int(arg) 
    #define debug_rect(arg) 
    #define debug_bool(arg) 
    #define debug_point(arg) 
    #define debug_float(arg) 
#endif 
Powiązane problemy