Loading... <div id="article_content" class="article_content"> <h3>NSLog的定义</h3> <p>NSLog定义在NSObjCRuntime.h中,如下所示:</p> <p>void NSLog(NSString *format, …);</p> <p>基本上,NSLog很像printf,同样会在console中输出显示结果。不同的是,传递进去的格式化字符是NSString的对象,而不是chat *这种字符串指针。</p> <p><!--more--></p> <h3>示例</h3> <p>NSLog可以如下面的方法使用:</p> <p>NSLog (@"this is a test");</p> <p>NSLog (@"string is :%@", string);</p> <p>NSLog (@"x=%d, y=%d", 10, 20);</p> <p>但是下面的写法是不行的:</p> <p>int i = 12345;</p> <p>NSLog( @"%@", i );</p> <p>原因是, %@需要显示对象,而int i明显不是一个对象,要想正确显示,要写成:</p> <p> </p> <p>int i = 12345;</p> <p>NSLog( @"%d", i );</p> <h3>输出:</h3> <p>2009-03-23 11:01:32.936 DebugLog[12085:807] Hello, World!</p> <p>上面的信息依次为时间,进程名称,进程ID,线程ID,Log的内容。</p> <h3>格式</h3> <p>NSLog的格式如下所示:</p> <p> </p> <ul> <li>%@ 对象 </li> <li>%d, %i 整数 </li> <li>%u 无符整形 </li> <li>%f 浮点/双字 </li> <li>%x, %X 二进制整数 </li> <li>%o 八进制整数 </li> <li>%zu size_t </li> <li>%p 指针 </li> <li>%e 浮点/双字 (科学计算) </li> <li>%g 浮点/双字 </li> <li>%s C 字符串 </li> <li>%.*s Pascal字符串 </li> <li>%c 字符 </li> <li>%C unichar </li> <li>%lld 64位长整数(long long) </li> <li>%llu 无符64位长整数 </li> <li>%Lf 64位双字</li> </ul> <p> </p> <p>使用NSLog的一个风险是:它的运行会占用时间和设备资源。当我们用Simulator时,NSLog的资源占用并不引人注意,风险也不会显示出来。但是如果你写的是一个即时战略游戏,而你在每一个action中都加入了NSLog——那么NSLog将成为一个魔鬼。灾难的具体表现常常是:你在Simulator中运行游戏畅通无阻,但到了真机上,会发现很“卡”,不论是拖动一个单位还是缩放一个场景,FPS也降到了各位数。</p> <p>简单而粗暴的解决方案是:在一个游戏release前,将所有的NSLog注释掉。简单有效,但副作用是:下次你要调试时,又得将NSLog一个个取消注释。</p> <p>我找到了一个最为有效的解决方案:你以release模式编译的程序不会用NSLog输出,而你以debug模式编译的程序将执行NSLog的全部功能。</p> <p style="font: 12px Monaco; color: #79482e;">#ifndef __OPTIMIZE__<br /># define NSLog(…) NSLog(__VA_ARGS__)<br />#else<br /># define NSLog(…) {}<br />#endif</p> <p>这个代码的魔术在于:release模式通常会定义 __OPTIMIZE__,当然debug模式不会。将这段代码放在你的头文件当中,你就可以放心的使用NSLog了!</p> </div> 相关文章 jQuery switchery 类似IOS的开关按钮使用 iOS7.1固件下载地址大全(苹果官方正式版) 中国移动个人热点 for iso4.3.2 360手机卫士 iPhone版更新V1.5.3正式版 Last modification:February 17th, 2012 at 04:09 pm © 允许规范转载 Support 如果觉得我的文章对你有用,请随意赞赏 ×Close Appreciate the author Sweeping payments Pay by AliPay Pay by WeChat