前言:
我們在發(fā)布App的時候烤蜕,??要求我們?nèi)∠械腘SLog兵拢,大概是因為:
1)輸出日志是會大量損耗系統(tǒng)性能。
2)輸出的信息很容易會被截取到粘优,導(dǎo)致信息不安全。
如果一行一行地去注釋掉NSLog呻顽,顯然不是一個明智的選擇雹顺。因此我們可以使用宏去自定義NSLog輸出。
先說一點關(guān)于NSLog使用的格式問題廊遍,我是今天實驗過后才是到嬉愧,也許你之前就已經(jīng)知道,這一點有助于理解下文中宏定義中的格式問題:
通常使用NSLog
我是這么用的
NSLog(@"%@", @"大家好"); // 一個參數(shù)
NSLog(@"%@ %@", @"大家好", @"才是真的好"); // 兩個參數(shù)
NSLog(@"%@ %@ %@", @"大家好", @"才是真的好", @"XX真好喉前!"); // 三個參數(shù)
打印結(jié)果:
2016-05-27 11:53:05.045 ViewController[4524:111041] 大家好
2016-05-27 11:53:05.045 ViewController[4524:111041] 大家好 才是真的好
2016-05-27 11:53:05.045 ViewController[4524:111041] 大家好 才是真的好 XX真好没酣!
但是,今天發(fā)現(xiàn)NSLog中的格式可以是下面這樣:
NSLog(@"%@" "%@", @"大家好", @"才是真的好"); // 兩個參數(shù)
NSLog(@"%@" "%@" "%@", @"大家好", @"才是真的好", @"XX真好卵迂!"); // 三個參數(shù)
打印結(jié)果:
2016-05-27 11:53:05.046 ViewController[4524:111041] 大家好才是真的好
2016-05-27 11:53:05.046 ViewController[4524:111041] 大家好才是真的好XX真好裕便!
你看明白了嗎?(__)
1)簡單的NSLog
我們在調(diào)試程序的時候见咒,往往需要輸出一些日志信息偿衰,用到NSLog函數(shù),當(dāng)我們準(zhǔn)備發(fā)布程序改览,需要注釋掉NSLog代碼下翎,這個時候往往會定義一個宏,在調(diào)試的時候宝当,會輸出日志视事,在Release正式版本的時候,會關(guān)閉日志輸出庆揩。代碼如下:
#ifdef DEBUG
#define GCLog(fmt, ...) NSLog((fmt), ##__VA_ARGS__);
#else
#define GCLog(...);
上面這段代碼俐东,是最常見的自定義NSLog的方式跌穗,但是上面的這段代碼有一定的局限性,就是日志信息不夠明確虏辫,如果在調(diào)試窗口打印N多信息的話瞻离,我么想知道某條日志信息是哪個類、哪一行打印的怎么辦呢乒裆?
2)打印詳細(xì)的日志信息
#ifdef DEBUG
# define DLog(fmt, ...) NSLog((@"\n[File:%s]\n" "[Function:%s]\n" "[Line:%d] \n" fmt), __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__);
#else
# define DLog(...);
#endif
我們下面調(diào)用這個自定義的宏:
- (void)viewDidLoad {
DLog(@"%@", @"你好")
}
打印結(jié)果如下:
2016-05-27 11:23:36.089 LogisticsDriver[3893:90262]
[File:/Users/ZZZ/Documents/SVN/LogDemo/LogDemo/ViewController.m]
[Function:-[ViewController viewDidLoad]]
[Line:26]
你好
3)參數(shù)解釋
__VA_ARGS__ 是一個可變參數(shù)的宏套利,很少人知道這個宏,這個可變參數(shù)的宏是新的C99規(guī)范中新增的鹤耍,目前似乎只有g(shù)cc支持(VC6.0的編譯器不支持)肉迫。宏前面加上##的作用在于,當(dāng)可變參數(shù)的個數(shù)為0時稿黄,這里的##起到把前面多余的","去掉的作用,否則會編譯出錯, 你可以試試喊衫。
__FILE__ 宏在預(yù)編譯時會替換成當(dāng)前的源文件名
__LINE__宏在預(yù)編譯時會替換成當(dāng)前的行號
-
__FUNCTION__宏在預(yù)編譯時會替換成當(dāng)前的函數(shù)名稱
有了以上這幾個宏,特別是有了__VA_ARGS__ 杆怕,調(diào)試信息的輸出就變得靈活多了族购。- VA_ARGS 是一個可變參數(shù)的宏,很少人知道這個宏陵珍,這個可變參數(shù)的宏是新的C99規(guī)范中新增的寝杖,目前似乎只有g(shù)cc支持(VC6.0的編譯器不支持)。宏前面加上##的作用在于互纯,當(dāng)可變參數(shù)的個數(shù)為0時瑟幕,這里的##起到把前面多余的","去掉的作用,否則會編譯出錯, 你可以試試。
- FILE 宏在預(yù)編譯時會替換成當(dāng)前的源文件名
- LINE宏在預(yù)編譯時會替換成當(dāng)前的行號
-
FUNCTION宏在預(yù)編譯時會替換成當(dāng)前的函數(shù)名稱
有了以上這幾個宏留潦,特別是有了VA_ARGS 只盹,調(diào)試信息的輸出就變得靈活多了。
4)參考
http://www.cnblogs.com/GarveyCalvin/p/4157553.html
http://blog.csdn.net/laomai/article/details/276274
http://stackoverflow.com/questions/21873616/how-to-use-va-args-properly