4

更新:

更多信息在这里:

真的不应该在生产代码上使用 NSLog() 吗?

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

情况

我有一些非常漂亮的 NSLog 调用,用于调试应用程序中更复杂的部分。但是,我最近才知道这些会影响运行时性能!

目标

我想在我没有从 Xcode 中实际执行 Product > Run(又名 command-R)的任何运行期间删除我的 NSLog 调用 - 特别是在这个东西部署在 App Store 上的情况下,以及当我运行与 Xcode 断开连接时的应用程序(即在街上走时只需点击图标)。

建议的解决方案?

假设我已经创建了一个 VIEW_DEBUG 的预处理器宏,那么在我上面描述的情况下,以下实现是否会有效地从执行中删除 NSLog 调用?

    <bunch of code>

#ifdef VIEW_DEBUG
    NSLog(@"really complex logs entries");
#endif

    <even more code>

这对我来说很难“测试”,所以我想我会吸引更有经验的人。:)

Xcode 设置(供参考)

代码设置

4

2 回答 2

12

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

#ifdef DEBUG    
#define DebugLog(...) NSLog(__VA_ARGS__)
#else
#define DebugLog(...) while(0)
#endif

Xcode 在执行调试构建时已经为您定义了 DEBUG(如屏幕截图所示)。VA_ARGS是一种创建可变参数宏的方法,它是在 C99 中引入的。确保 DebugLog 具有相同的do/while净句法效果,即使它不做任何事情——不要担心无意义的循环,优化器会为你删除它。

然后,您可以DebugLog完全按照您的使用方式使用NSLog. 这将完全按照您的建议进行,VIEW_DEBUG但您不必复制和粘贴#ifdef条件一千次。

于 2012-08-26T23:49:39.383 回答
3

我总是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 替代品的演变

于 2012-08-27T01:17:05.857 回答