在Xcode中开发时,往往需要利用NSLog()函数来打印一些调试信息。打印这些调试信息会消耗一定的系统资源,因为模拟器使用的是电脑的硬件,所以在运行应用时不会有什么影响,但如果在真实的移动设备上也打印大量的调试信息,会在很大程度上影响应用的性能。另外输出的信息还有可能暴露应用的一些保密数据。所以发布应用的正式版时,应屏蔽调试信息。
针对以上问题,我们可以在预编译文件Prefix.pch中写一些宏来控制
#ifdef DEBUG
//__VA_ARGS__代表可变参数宏
#define DebugLog(format, ...) NSLog(format, ##__VA_ARGS__)
#else
#define DebugLog(format, ...)
#endif
这样,当只想在Debug版本中记录调试信息,可以使用DebugLog()函数。如果想在所有版本中都记录调试信息可以直接使用NSLog()函数。
PS:如果想全局替换NSLog()函数,可以在终端输入命令$ sed -i ".bak" 's/NSLog/DebugLog/' *.m,另外也可以直接在Xcode中全局替换。
如果不想使用NSLog输出的基本信息,也可以自定义输出的基本信息及其格式
// 获取系统当前毫秒级时间
#define logTime ({\
struct timeb currentTime;\
ftime(¤tTime);\
char secondLevelStr[9];\
strftime(secondLevelStr, 9, "%H:%M:%S", localtime(¤tTime.time));\
char millisecondLevelStr[13];\
sprintf(millisecondLevelStr, "%s.%03d", secondLevelStr, currentTime.millitm);\
millisecondLevelStr;\
})
#ifdef DEBUG
#define DebugLog(format, ...) fprintf(stderr, "%s %s[%d] %s\n", logTime, [[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], __LINE__, [[NSString stringWithFormat:format, ##__VA_ARGS__] UTF8String])
#else
#define DebugLog(format, ...)
#endif
网友评论