使用NSLog的一個風險是:它的運行會佔用時間和裝置資源。當我們用Simulator時,NSLog的資源佔用並不引人注意,風險也不會顯示出來。但是如果你寫的是一個即時戰略遊戲,而你在每一個action中都加入了NSLog——那麼NSLog將成為一個魔鬼。災難的具體表現常常是:你在Simulator中運行遊戲暢通無阻,但到了真機上,會發現很“卡”,不論是拖動一個單位還是縮放一個情境,FPS也降到了各位元。
簡單而粗暴的解決方案是:在一個遊戲release前,將所有的NSLog注釋掉。簡單有效,但副作用是:下次你要調試時,又得將NSLog一個個取消注釋。
解決方案:你以release模式編譯的程式不會用NSLog輸出,而你以debug模式編譯的程式將執行NSLog的全部功能。
#ifndef __OPTIMIZE__
# define NSLog(…) NSLog(__VA_ARGS__)
#else
# define NSLog(…) {}
#endif
這個代碼的魔術在於:release模式通常會定義 __OPTIMIZE__,當然debug模式不會。將這段代碼放在你的標頭檔當中,你就可以放心的使用NSLog了!
上面的宏是使用qDebug輸出調試資訊,在非Qt的程式中也可以改為printf,守護進程則可以改為syslog等等... 其中,決竅其實就是這幾個宏 ##__VA_ARGS__, __FILE__, __LINE__ 和__FUNCTION__,下面介紹一下這幾個宏:
補充:
1) __VA_ARGS__ 是一個可變參數的宏,很少人知道這個宏,這個可變參數的宏是新的C99規範中新增的,目前似乎只有gcc支援(VC6.0的編譯器不支援)。宏前面加上##的作用在於,當可變參數的個數為0時,這裡的##起到把前面多餘的","去掉的作用,否則會編譯出錯,
你可以試試。
2) __FILE__ 宏在先行編譯時會替換成當前的源檔案名稱
3) __LINE__宏在先行編譯時會替換成當前的行號
4) __FUNCTION__宏在先行編譯時會替換成當前的函數名稱