使用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
這樣控制台會顯示這樣的日志資訊
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__);