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

tob*_*pwn 4 objective-c ios ios5

更新:

有关这方面的更多信息:

是否应该在生产代码上使用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>
Run Code Online (Sandbox Code Playgroud)

对我来说,这是一个很难"测试",所以我认为我会吸引更多有经验的人.:)

Xcode设置(供参考)

xcode设置

Tom*_*mmy 12

一个常见的解决方案是将以下代码放在您的前缀文件中(或者您可以#include根据需要创建一个专用类):

#ifdef DEBUG    
#define DebugLog(...) NSLog(__VA_ARGS__)
#else
#define DebugLog(...) while(0)
#endif
Run Code Online (Sandbox Code Playgroud)

在执行调试构建时,Xcode已经为您定义了DEBUG(如屏幕截图所示).VA_ARGS是一种创建C99中引入的可变参数宏的方法.在do/while这DEBUGLOG具有即使什么都不做相同的净效果句法保证-不用担心无谓的循环,优化器将删除它.

然后你可以DebugLog完全按照你的使用方式使用NSLog.这将完全符合您的建议,VIEW_DEBUG但您无需复制和粘贴#ifdef条件一千次.