天天看點

在ios iphone程式設計中使用封裝的NSLog來列印調試資訊

使用nslog的一個風險是:它的運作會占用時間和裝置資源。

簡單而粗暴的解決方案是:在release前,将所有的nslog注釋掉。簡單有效,但副作用是:下次你要調試時,又得将nslog一個個取消注釋。

以release模式編譯的程式不會用nslog輸出,而以debug模式編譯的程式将執行nslog的全部功能。

解決步驟:

修改<appname>-prefix.pch ,增加以下的宏代碼

#ifdef debug  

# define dlog(fmt, ...) nslog((@"[檔案名:%s]\n" "[函數名:%s]\n" "[行号:%d] \n" fmt), __file__, __function__, __line__, ##__va_args__);  

#else  

# define dlog(...);  

#endif  

在程式中使用dlog來替換原來的nslog

dlog(@"目前程式目錄是:%@", [self applicationdocumentsdirectory ]);  

修改項目的配置,使得在debug編譯的時候,編譯dlog的宏,産生詳細的日志資訊,而release的時候,不産生任何控制台輸出

在other linker flags 中,在debug的時候,加入編譯屬性 -debug

在ios iphone程式設計中使用封裝的NSLog來列印調試資訊

這樣控制台會顯示這樣的日志資訊

2011-12-27 22:23:53.303 imanager[5449:b603] [檔案名:/users/roamer/project/ÂõΩÊ≥∞ÂêõÂÆâ/Ëꕉ∏öÈÉ®ÁưÁêÜiphone/imanager/imanager/appdelegate.m]  

[函數名:-[appdelegate application:didfinishlaunchingwithoptions:]]  

[行号:37]   

目前程式目錄是:/users/roamer/library/application support/iphone simulator/4.3.2/applications/6b0e7b08-5528-468a-b728-0c4580805368/documents  

補充:

  1) __va_args__ 是一個可變參數的宏,很少人知道這個宏,這個可變參數的宏是新的c99規範中新增的,目前似乎隻有gcc支援(vc6.0的編譯器不支援)。宏前面加上##的作用在于,當可變參數的個數為0時,這裡的##起到把前面多餘的","去掉的作用,否則會編譯出錯,

你可以試試。

  2) __file__ 宏在預編譯時會替換成目前的源檔案名

  3) __line__宏在預編譯時會替換成目前的行号

  4) __function__宏在預編譯時會替換成目前的函數名稱

#define devide_line

"\n>>>> =========================================== <<<< \n"

# define mylog(fmt, ...) nslog((@devide_line

"%s , " "[行号:%d] " fmt) , __function__, __line__, ##__va_args__); 

#define ll_log(fmt, ...) mylog(@" \n>>              ll print                << \n " fmt devide_line, ##__va_args__);