繁体   English   中英

Objective-C:从'Distribution'/ production builds中删除NSLog调用?

[英]Objective-C: Removing NSLog calls from 'Distribution'/production builds?

更新:

有关这方面的更多信息:

是否应该在生产代码上使用NSLog()?

~~~~~~~~~~~~~~~~~~~~~~~~

情况

我有一些非常好的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设置 (供参考)

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM