[iPhone] NSLog 업그레이드 + Debug 모드에서만 로깅하기

iPhone 개발환경을 보면 Visual Studio, Eclipse와 같은 화려한 IDE의 지원을 받아오던 저로서는 답답하고 답답하고 안타깝기에 그지없는 상황이 자주 연출되곤 합니다.

가끔씩 gdb에 근거한 알수없는 로깅시스템도 한몫을 하는데요 우리의 허접하기 짝이없는 NSLog를 화려하게 업그레이드 시키는 방법을 알아보도록 할까요.

우선 목표는 NSLog의 내용을 파일명과 에러발생 지점 라인, 기타 정보를 포함함과 동시에 빌드시에 선택하는 ActiveConfiguration을 Debug로 선택했을때만 로깅하도록 해보겠습니다.

사용자 삽입 이미지그림을 하나 보도록 하겠습니다. 이것과 같은 순서로 OTHER_CFLAGS를 추가하면 됩니다.
(1) 자신의 프로젝트 루트를 선택합니다.
(2) Info버튼을 눌러 Build 탭으로 이동합니다.
(3) Debug를 선택합니다.
(4) Show에서는 Setting defined this level을 선택해 줍니다.
(5) 그림에는 안나왔는데 좌측 하단의 Add User-defined setting을 눌러 OTHER_CFLAGS = -DDEBUG=1 을 추가해 줍니다.

이제 Debug모드로 컴파일할때는 #define DEBUG 1 이 자동으로 설정되게 됩니다.

이제 각각의 프로젝트의 prefix를 열어봅시다. 보통은 프로젝트명_Prefix.pch 이름을 가지고 있습니다.
다음을 추가해 주도록 합시다.

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

이제는 Debug모드일때만 이쁘게 로깅을 하며, 그외의 경우에는 NSLog가 아예 동작하지 않게 됩니다. 한결 좋아졌네요.

참고 :
http://iphoneincubator.com/blog/debugging/the-evolution-of-a-replacement-for-nslog
http://stackoverflow.com/questions/300673/is-it-true-that-one-should-not-use-nslog-on-production-code