NSLog 遮蔽輸出

2021-08-26 10:28:41 字數 983 閱讀 5385

使用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__巨集在預編譯時會替換成當前的函式名稱

iOS 發布應用時遮蔽NSLog

在開發過程中,經常需要使用nslog來進行除錯,但是nslog是非常影響效能的,所以我們應該在發布應用時遮蔽掉nslog,但是如果通過手工的去一行一行的改得話,未免太枯燥與費時了,慶幸的是,我們可以通過條件預編譯來遮蔽nslog。示例 如下 在專案中需要列印的地方使用wklog 應用程式的兩種狀態 ...

NSLog 輸出函式集格式字元

nslog 強大的功能這裡就不多說了,筆者從c 轉過來,難免會有些陌生。在c 中用format xx 來進行佔位,下面就來講講在oc中的格式字元 d 帶符號的十進位制形式輸出整數 正數不輸出符號 o 以八進位制無符號形式輸出整數 不輸出字首 x 以十六進製制無符號形式輸出整數 不輸出0x u 以無符...

Objective C中NSLog輸出格式大全

物件 d,i 整數 u nbwww.cppcns.comsp 無符整形 f nbsfgjulztp 浮點 雙字 x,x 二進位制整數 nbs程式設計客棧p o 八進位制整數 zu size t p 指標 e 浮點 雙字 科學計算 g 浮點 雙字 s c 字串 s pascal字串 c 字元 c ww...