最近在重構(gòu)消息模塊,研究云信官方demo的時(shí)候發(fā)現(xiàn)他們用 CocoaLumberjack
這個(gè)三方框架來監(jiān)控日志輸出,我之前也有在自己的項(xiàng)目中引入 NSSLogger
來達(dá)到類似的目的。
ps: 我們項(xiàng)目中一直存在一坨宏纱意,也不知道誰加上去的2333
#ifdef DEBUG
#define DLog( s, ... ) NSLog( @"<%p %@:(%d)> %@", self, [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__] )
#define ALog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
#else
#define DLog( s, ... )
#define ALog(...)
#endif
今天特地整理一下這些debug的時(shí)候常用的宏
- 打印函數(shù)的宏
__func__
、__FUNCTION__
、__PRETTY_FUNCTION__
測(cè)試代碼段如下:
NSLog(@"__func__:%s,",__func__);
NSLog(@"__FUNCTION__:%s,",__FUNCTION__);
NSLog(@"__PRETTY_FUNCTION__:%s,",__PRETTY_FUNCTION__);
在oc的方法中他們的表現(xiàn)是一樣的团秽,輸出如下:
2017-02-16 15:30:31.474 testdemo[74077:387792] __func__:-[testViewController test],
2017-02-16 15:30:31.474 testdemo[74077:387792] __FUNCTION__:-[testViewController test],
2017-02-16 15:30:31.475 testdemo[74077:387792] __PRETTY_FUNCTION__:-[testViewController test],
在main函數(shù)中(也就是函數(shù)作為程序的一級(jí)成員時(shí)),輸出如下:
2017-02-16 16:34:36.234 testdemo[82693:425275] __func__:main,
2017-02-16 16:34:36.234 testdemo[82693:425275] __FUNCTION__:main,
2017-02-16 16:34:36.235 testdemo[82693:425275] __PRETTY_FUNCTION__:int main(int, char **),
其中 __PRETTY_FUNCTION__
會(huì)輸出 當(dāng)前所在函數(shù)名叭首,包括返回類型和參數(shù)類型习勤,而在有一些IDE環(huán)境中是不支持 __func__
的。
- 打印時(shí)間的宏
__TIME__
焙格、__DATE__
測(cè)試代碼段如下:
NSLog(@"__TIME__:%s,",__TIME__);
NSLog(@"__DATE__:%s,",__DATE__);
__TIME__
會(huì)輸出當(dāng)前源文件編譯的日期图毕,__DATE__
會(huì)輸出進(jìn)行預(yù)處理的日期,輸出如下:
2017-02-16 16:43:03.170 testdemo[82693:425275] __TIME__:15:30:13,
2017-02-16 16:43:03.171 testdemo[82693:425275] __DATE__:Feb 16 2017,
- 打印代碼信息相關(guān)的宏
__LINE__
眷唉、__FILE__
其中__LINE__
會(huì)輸出源文件中當(dāng)前代碼所在行號(hào)予颤,__FILE__
會(huì)輸出當(dāng)前源文件本地所在的絕對(duì)路徑
測(cè)試結(jié)果如下:
//測(cè)試代碼片段
51 NSLog(@"__LINE__:%d,",__LINE__);
52 NSLog(@"__FILE__:%s,",__FILE__);
//控制臺(tái)輸出
2017-02-16 16:43:03.170 testdemo[82693:425275] __LINE__:51,
2017-02-16 16:43:03.170 testdemo[82693:425275] __FILE__:/Users/hanling/Desktop/testdemo/testdemo/testViewController.m,
- 輸出可變參數(shù)的宏
__VA_ARGS__
(C99提供的可變宏),在上文DLog中也有用到過冬阳。
它是可變參數(shù)宏蛤虐,對(duì)他進(jìn)行宏定義可以傳入不定個(gè)數(shù)的參數(shù),在他前面加上##
則表示可變參數(shù)被忽略或?yàn)榭諘r(shí)會(huì)直接將其帶來的負(fù)面效果移除肝陪,就像__VA_ARGS__
完全沒有存在一樣驳庭。
舉個(gè)例子:
#define DLog( s, ... ) NSLog( @"<%p %@:(%d)> %@", self, [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__] )
這個(gè)宏在 DLog( s, ... )
中傳入的可變參數(shù)個(gè)數(shù)為0時(shí),##__VA_ARGS__
前的逗號(hào)不會(huì)被輸出
第二種可變參數(shù)的宏定義方法(GCC提供的可變宏)
#define cprint(format,args...) NSLog(format, ##args)
在 Xcode
中這兩種方式都是支持的
另外:在OC中我們還可以這么玩(來自喵神的博客)
//輸出當(dāng)前方法
NSLog(@"Current selector: %@",NSStringFromSelector(_cmd));
//輸出當(dāng)前類
NSLog(@"Object class: %@",NSStringFromClass(self.class));
//輸出當(dāng)前源文件名
NSLog(@"Filename: %@",[[NSString stringWithUTF8String:__FILE__] lastPathComponent]);
如果有需要你還可以利用OC的反射機(jī)制打印更多東西