Release釋出log遮蔽方法

benbenxiongyuan發表於2013-08-21
在開發過程中一般會用到NSLog(<#NSString *format, ...#>)來獲得具體的資訊。
但當我們釋出app時,一步一步的去找NSLog(<#NSString *format, ...#>),並遮蔽掉,這樣比較浪費時間還很累。我們可以採用預編譯的方式來簡化這個問題。

在***-Prefix.pch裡面新增

#define DEBUG_MODE


#ifdef DEBUG_MODE

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

#else

#define DebugLog( s, ... )

#endif


這樣當我們需要列印log時採用DebugLog( s, ... ),就可以了。如果我們需要打release版本就直接登出掉#define DEBUG_MODE,就可以了。
 
 
這裡有幾個巨集 ##__VA_ARGS__, __FILE__, __LINE__ 和__FUNCTION__,下面介紹一下:
  1) __VA_ARGS__ 是一個可變引數的巨集,很少人知道這個巨集,這個可變引數的巨集是新的C99規範中新增的,目前似乎只有gcc支援(VC6.0的編譯器不支援)。巨集前面加上##的作用在於,當可變引數的個數為0時,這裡的##起到把前面多餘的","去掉的作用,否則會編譯出錯, 你可以試試。
  2) __FILE__ 巨集在預編譯時會替換成當前的原始檔名
  3) __LINE__巨集在預編譯時會替換成當前的行號
  4) __FUNCTION__巨集在預編譯時會替換成當前的函式名稱
 
舉個例子特別說明一下...和__VA_ARGS__
實現思想就是巨集定義中引數列表的最後一個引數為省略號(也就是三個點)。這樣預定義巨集_ _VA_ARGS_ _就可以被用在替換部分中,替換省略號所代表的字串。比如:
#define PR(...) printf(__VA_ARGS__)
int main()
{
int wt=1,sp=2;
PR("hello\n");
PR("weight = %d, shipping = %d",wt,sp);
return 0;
}
輸出結果:
hello
weight = 1, shipping = 2
省略號只能代替最後面的巨集引數。
#define W(x,...,y)錯誤!

相關文章