[objective-c] 메소드 이름과 줄 번호를 인쇄하고 조건부로 NSLog를 비활성화하는 방법은 무엇입니까?

Xcode에서 디버깅에 대한 프레젠테이션을하고 NSLog를 효율적으로 사용하는 방법에 대한 자세한 정보를 얻고 싶습니다.

특히 두 가지 질문이 있습니다.

  • 현재 메소드의 이름 / 줄 번호를 쉽게 NSLog하는 방법이 있습니까?
  • 릴리스 코드를 컴파일하기 전에 모든 NSLog를 쉽게 “비활성화”하는 방법이 있습니까?


답변

NSLog 주위에 유용한 매크로가 많이 있습니다.

#ifdef DEBUG
#   define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__)
#else
#   define DLog(...)
#endif

// ALog always displays output regardless of the DEBUG setting
#define ALog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__)

DLog 매크로는 DEBUG 변수가 설정된 경우에만 출력하는 데 사용됩니다 (디버그 구성에 대한 프로젝트의 C 플래그에서 -DDEBUG).

ALog는 항상 일반 NSLog와 같은 텍스트를 출력합니다.

출력 (예 : ALog (@ “Hello world”))은 다음과 같습니다.

-[LibraryController awakeFromNib] [Line 364] Hello world


답변

내가 찍은 DLogALog위에서, 그리고 추가 ULog제기하는 UIAlertView메시지를.

요약:

  • DLogNSLogDEBUG 변수가 설정된 경우에만 출력 됩니다
  • ALog 항상 다음과 같이 출력됩니다 NSLog
  • ULogUIAlertViewDEBUG 변수가 설정된 경우에만 표시 됩니다
#ifdef DEBUG
# define DLog (fmt, ...) NSLog ((@ "% s [Line % d]"fmt), __PRETTY_FUNCTION__, __LINE__, ## __ VA_ARGS__);
#그밖에
# DLog 정의 (...)
#endif
#define ALog (fmt, ...) NSLog ((@ "% s [Line % d]"fmt), __PRETTY_FUNCTION__, __LINE__, ## __ VA_ARGS__);
#ifdef DEBUG
# define ULog (fmt, ...) {UIAlertView * alert = [[UIAlertView alloc] initWithTitle : [NSString stringWithFormat : @ "% s \ n [Line % d]", __PRETTY_FUNCTION__, __LINE__] 메시지 : [NSString stringWithFormat : fmt , ## __ VA_ARGS__] delegate : nil cancelButtonTitle : @ "Ok"otherButtonTitles : nil]; [경고 쇼]; }
#그밖에
# ULog 정의 (...)
#endif

이것은 다음과 같습니다

UIAlertView 디버그

디 데릭 +1


답변

NSLog(@"%s %d %s %s", __FILE__, __LINE__, __PRETTY_FUNCTION__, __FUNCTION__);

파일 이름, 줄 번호 및 기능 이름을 출력합니다.

/proj/cocoa/cdcli/cdcli.m 121 managedObjectContext managedObjectContext

__FUNCTION__C ++에서 맹 글링 된 이름 __PRETTY_FUNCTION__은 멋진 함수 이름을 보여 주며 코코아에서는 동일하게 보입니다.

NSLog를 비활성화하는 올바른 방법이 무엇인지 잘 모르겠습니다.

#define NSLog

로깅 출력이 나타나지 않았지만 부작용이 있는지 모르겠습니다.


답변

여기에 우리가 사용하는 디버그 상수의 큰 모음이 있습니다. 즐겨.

// 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


답변

답이없는 새로운 트릭이 있습니다. printf대신 사용할 수 있습니다 NSLog. 이것은 당신에게 깨끗한 로그를 줄 것입니다 :

NSLog당신 과 함께 이런 것들을 얻을 :

2011-11-03 13:43:55.632 myApp[3739:207] Hello Word

그러나 printf당신은 얻을 :

Hello World

이 코드를 사용하십시오

#ifdef DEBUG
    #define NSLog(FORMAT, ...) fprintf(stderr,"%s\n", [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);
#else
    #define NSLog(...) {}
#endif


답변

이 질문에 대한 나의 대답 은 도움 될 것입니다. Diederik가 요리 한 것과 비슷합니다. 또한 호출을 NSLog()사용자 정의 로깅 클래스의 정적 인스턴스 로 교체하여 디버그 / 경고 / 오류 메시지에 대한 우선 순위 플래그를 추가하거나 콘솔 또는 파일 또는 데이터베이스로 메시지를 보낼 수 있습니다. 당신이 생각할 수있는 다른 모든 것.

#define DEBUG_MODE

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


답변

MACROS에 알레르기가있는 사람을 위해 모든 NSLog를 비활성화하면 다음과 같이 컴파일 할 수 있습니다.

void SJLog(NSString *format,...)
{
    if(LOG)
    {
        va_list args;
        va_start(args,format);
        NSLogv(format, args);
        va_end(args);
    }
}

그리고 NSLog와 거의 비슷하게 사용하십시오.

SJLog(@"bye bye NSLogs !");

이 블로그에서 : https://whackylabs.com/logging/ios/2011/01/19/ios-moving-in-and-out-of-nslogs/