[英]Objective-C: Removing NSLog calls from 'Distribution'/production builds?
更新:
有关这方面的更多信息:
~~~~~~~~~~~~~~~~~~~~~~~~
情况
我有一些非常好的NSLog调用,我用它来调试应用程序中更复杂的部分。 但是,我刚刚了解到这些会影响运行时性能!
目标
我希望在任何运行期间删除我的NSLog调用,其中我实际上没有在Xcode中执行Product> Run(aka command-R) - 特别是在App Store上部署此东西的情况下,以及当我运行时应用程序从Xcode断开连接时(即只是在街上行走时点击图标)。
建议的解决方案?
假设我已经创建了VIEW_DEBUG的预处理器宏,那么下面的实现是否会有效地从我上面描述的情况中删除NSLog调用?
<bunch of code>
#ifdef VIEW_DEBUG
NSLog(@"really complex logs entries");
#endif
<even more code>
对我来说这是一个很难“测试”,所以我想我会吸引更有经验的人。 :)
Xcode设置 (供参考)
一个常见的解决方案是将以下代码放在您的前缀文件中(或者您可以创建一个专用类并根据需要#include
它):
#ifdef DEBUG
#define DebugLog(...) NSLog(__VA_ARGS__)
#else
#define DebugLog(...) while(0)
#endif
在执行调试构建时,Xcode已经为您定义了DEBUG(如屏幕截图所示)。 VA_ARGS是一种创建C99中引入的可变参数宏的方法。 do/while
确保DebugLog具有相同的网络语法效果,即使它没有做任何事情 - 不要担心无意义的循环,优化器会为你删除它。
然后,您可以像使用NSLog
一样使用DebugLog
。 这将完全按照您的建议使用VIEW_DEBUG
但不必将#ifdef
条件复制并粘贴一千次。
我总是在我的代码中使用DLog
,它很棒。
// DLog is almost a drop-in replacement for NSLog
// DLog();
// DLog(@"here");
// DLog(@"value: %d", x);
// Unfortunately this doesn't work DLog(aStringVariable); you have to do this instead DLog(@"%@", aStringVariable);
#ifdef DEBUG
# define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
#else
# define DLog(...)
#endif
// ALog always displays output regardless of the DEBUG setting
#define ALog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
更多信息: NSLog替换的演变
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.