NSLog的定義
NSLog定義在NSObjCRuntime.h中,如下所示:
void NSLog(NSString *format, …);
基本上,NSLog很像printf,同樣會在console中輸出顯示結果。不同的是,傳遞進去的格式化字符是NSString的對象,而不是chat *這種字符串指針。
示例
NSLog可以如下面的方法使用:
NSLog (@"this is a test");
NSLog (@"string is :%@", string);
NSLog (@"x=%d, y=%d", 10, 20);
但是下面的寫法是不行的:
int i = 12345;
NSLog( @"%@", i );
原因是, %@需要顯示對象,而int i明顯不是一個對象,要想正確顯示,要寫成:
int i = 12345;
NSLog( @"%d", i );
輸出:
2009-03-23 11:01:32.936 DebugLog[12085:807] Hello, World!
上面的信息依次爲時間,進程名稱,進程ID,線程ID,Log的內容。
格式
NSLog的格式如下所示:
- %@ 對象
- %d, %i 整數
- %u 無符整形
- %f 浮點/雙字
- %x, %X 二進制整數
- %o 八進制整數
- %zu size_t
- %p 指針
- %e 浮點/雙字 (科學計算)
- %g 浮點/雙字
- %s C 字符串
- %.*s Pascal字符串
- %c 字符
- %C unichar
- %lld 64位長整數(long long)
- %llu 無符64位長整數
- %Lf 64位雙字
使用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了!
原帖:http://blog.csdn.net/nicktang/article/details/6264713