转自:http://blog.csdn.net/NickTang/article/details/6264713#
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的格式如下所示:
使用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/sing_sing/article/details/6679207
今天突然看到一篇文章,介绍了NSLog的使用。NSLog其实不是简单的输出调试信息,还会做一些其他工作,这样在设备上运行的时候会降低效率。
所以优化NSLog就变得非常有必要了。在debug下显示log,在release下自动屏蔽log输出的代码。花了点时间,将网上的两种NSLog优化的方法综合了一下。
具体如下:
一、新建一个.h文件,命名为DLog.h。
DLog.h文件内容为:
//添加定义,在release时不会输出log
#ifndef __OPTIMIZE__
#define NSLog(...) NSLog(__VA_ARGS__)
#else
#define NSLog(...) {}
#endif
#ifndef __OPTIMIZE__
#define DLog(...) NSLog(__VA_ARGS__)
#else
#define DLog(...) /* */
#endif
#define ALog(...) NSLog(__VA_ARGS__)
二、添加到工程。
在appName-Prefix.pch中添加DLog.h头文件。
添加后如下所示:
#import <Availability.h>
#ifndef __IPHONE_3_0
#warning "This project uses features only available in iPhone SDK 3.0 and later."
#endif
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import "DLog.h"
#endif
通过这样定义,既可以用DLog,ALog,也可以使用系统自带的NSLog。
这样就可以在既高效又灵活的使用NSLog了。
参考文章如下:
http://www.cimgf.com/2009/01/24/dropping-nslog-in-release-builds/