美文网首页iOS开发Tips
NSLog暴力打印宏定义与性能优化

NSLog暴力打印宏定义与性能优化

作者: 金丝楠 | 来源:发表于2017-04-21 10:24 被阅读30次

在项目的过程中,经常遇到要在调试的时候打印log,但是上线或是release 的时候不需要去显示log 的情况,此时你辛辛苦苦写了那么多的log,你要么就手动注释掉,要么就是设一个开关变量,企图用这个总开关开启。其实可以充分利用宏定义进行设置。

另外,我们可能会加入一些打印信息来帮助我们跟踪应用的运行信息。可是过多的NSLog是非常耗费性能的,在Debug模式下我们需要打印这些信息以供找出bug,但是在用户使用时是不需要打印太多信息的,这里有两个原因:一方面是因为耗费手机性能;另一方面会泄漏一些敏感信息。所以为了解决以上问题我门需要做以下修正:

解决方案一

宏定义写法如下所示,步骤比较简单,只需要 在ProjectName_Prefix.pch中追加你对应的宏定义,不用import 就可以直接使用了。

#ifdef DEBUG  
#define LOG(...) NSLog(__VA_ARGS__);  
#define LOG_METHOD NSLog(@"%s", __func__);  
#else  
#define LOG(...); #define LOG_METHOD;  
#endif  

这样设置后,只需要在Product ->Scheme->Edit Scheme ->info选择,是release ,还是debug版本即可。如果debug 版本,则答应log,若release版本则不打印。

我们发布到appstore 上的版本均是release版本,这里简单说下这两个版本的差异。
release 是发行版本,比debug版本要小一些,他们调用两个不同底层库,debug 包含的信息多,可以断点调试,单步执行,使用使用TRACE/ASSERT等调试输出语句,
但是release 版本不包含调试信息,运行速度比较快。
另外在此处设置的DEBUG 参数可以在下面的路径进行设置:工程->Target->Build Setting ->Preprocessor Macros。默认系统已经给出了DEBUG的参数。如果要增加新的参数,则在哪里进行增加。

解决方案二

1,屏蔽Release模式下的打印信息
2, 增强NSLog的功能,得到更多的有用信息

如下代码:

//重写NSLog,Debug模式下打印日志和当前行数
#if DEBUG

#define NSLog(format, ...) do {                                             \
fprintf(stderr, "<%s : %d> %s\n",                                           \
[[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String],  \
__LINE__, __func__);                                                        \
(NSLog)((format), ##__VA_ARGS__);                                           \
fprintf(stderr, "-------\n");                                               \
} while (0)
#define NSLogRect(rect) NSLog(@"%s x:%.4f, y:%.4f, w:%.4f, h:%.4f", #rect, rect.origin.x, rect.origin.y, rect.size.width, rect.size.height)
#define NSLogSize(size) NSLog(@"%s w:%.4f, h:%.4f", #size, size.width, size.height)
#define NSLogPoint(point) NSLog(@"%s x:%.4f, y:%.4f", #point, point.x, point.y)
#else
#define NSLog(FORMAT, ...) nil
#define NSLogRect(rect) nil
#define NSLogSize(size) nil
#define NSLogPoint(point) nil
#endif

#endif

在使用以上代码前,请确保参数设置正确

参数配置.png

这里的DEBUG即为以上代码中的条件"DEBUG", 两者必须一致。

使用范例及效果:

NSLog(@"self.window = %@", self.window);
NSLog(@"self.window.rootViewController = %@", self.window.rootViewController);
演示效果.png

打印出了文件名,行号,函数名称等重要信息。并以"------"作为分隔符。

相关文章

  • NSLog暴力打印宏定义与性能优化

    在项目的过程中,经常遇到要在调试的时候打印log,但是上线或是release 的时候不需要去显示log 的情况,此...

  • iOS调试 - NSLog

    NSLog效率低下的原因及尝试lldb断点打印Log 宏定义的黑魔法 - 宏菜鸟起飞手册 NSLog 的优化 情况...

  • NSLog 打印全部信息

    NSLog 打印全部信息 宏定义 NSLog 打印中文 先写一个转义方法 NSLog 打印中文使用 可以在...

  • 0822- iOS常用宏定义

    [123](file://) 宏定义原文链接 全局打印 打印所在方法名与行数 重写NSLog 输出所在方法与行数 ...

  • IOS NSLog宏定义

    IOS NSLog宏定义 标签(空格分隔): IOS IOS NSLog宏定义 宏定义NSLog方法,不用加";"...

  • iOS开发中常用的宏定义

    iOS开发中常用的宏定义 尺寸宏 打印宏 替换NSLog来使用,debug模式下可以打印很多方法名,行信息。 #...

  • 改写NSLog的方法和好处

    不直接用NSLog 摘要: 公司中不直接使用NSLog,而是利用宏定义自己的打印函数,将该打印函数写在项目的.pc...

  • 使用NSLog打印 控制台没有输出

    原因:一直使用自定义的宏打印数据,系统的NSLog禁用了,调试BUG需要打印时间把自定义的宏输出注释了,使用系统N...

  • iOS常用的宏定义

    列举了一些常用的宏定义,比如屏幕宽高,系统版本,nslog打印等,不定期更新

  • iOS 常用的宏定义

    全局项目宏 NSLog输出宏 获取版本宏 将responsObject打印成plist到桌面 颜色宏

网友评论

本文标题:NSLog暴力打印宏定义与性能优化

本文链接:https://www.haomeiwen.com/subject/afxdzttx.html