介紹NSLog的使用

 

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章