【问题标题】:excluding NSLog's from release version of iPhone app从 iPhone 应用程序的发布版本中排除 NSLog
【发布时间】:2012-04-21 12:44:29
【问题描述】:

有人能介绍一下如何从应用程序的发布版本中免除 NSLog 吗?另外,是否将 cmets 留在发布版本中是否重要?谢谢!

【问题讨论】:

  • 大多数人都会根据调试标志创建自己的 DebugLog 宏或类似的宏。当您使用它时,您可以自动插入__PRETTY_FUNCTION__%s 以列出日志的来源。
  • 这篇文章被标记为 iPhone。您为什么要关心您的代码是否正在写入控制台?没有人会看到它。
  • Michael - 它会减慢应用程序不必要的日志记录,即使在 iPhone 上也是如此。虽然您看不到日志,但它仍然存在于设备本身中。

标签: iphone objective-c ios xcode


【解决方案1】:

Use a macro like DLog to wrap NSLog, and turn it off in Release builds.

#ifdef DEBUG
#    define DLog(...) NSLog(__VA_ARGS__)
#else
#    define DLog(...) /* */
#endif

评论绝对不重要。它们只存在于您的源代码中,而不是编译后的输出。您无需将源代码提交给 Apple,只需将应用的构建副本提交给 Apple。

【讨论】:

  • 我看到的唯一问题是你不能将它追溯应用到已经有很多 NSLogs 的应用程序。
  • 是的,但搜索和替换工作正常。或者,如果您点击链接,它会显示如何在终端中运行 sed 命令来执行相同的操作。
【解决方案2】:

我要排除 NSLogs 的方法是将其添加到前缀文件中:

#define NSLog(...)

这样编译时,所有的 NSLogs 都将被替换为空,就像一个空行。

至于 cmets,他们根本就不会把它变成二进制文件,那些只提供给能看到源代码的人。

【讨论】:

  • 不错!我希望我在更换所有 nslog 之前就想到了这一点。
  • 但有时您希望在发布的代码中出现一些 NSLog。最好为调试日志函数定义一个新宏。
  • 如果您只是想从发布版本中删除所有日志,这将按原样工作,您可以在希望显示日志时对其进行评论。
  • "define NSLog(...)" 方法非常聪明,但不如发布的"define DLog(...) NSLog (VA_ARGS) 方法可取更早。为什么?因为一个不知道你聪明定义的程序员会在代码中看到“NSLog”调用,并想知道它们为什么不工作,或者出于性能原因可能会删除它们。重新定义语义几乎总是一个坏主意已知标识符而不是引入新标识符。可读性非常重要。
  • @StanSieler 非常有效的观点。我一直在我自己工作的项目中使用这种方法,因为它是一个非常快速的解决方案,而且我已经习惯了,但我想在一个团队的大型项目中这样做是不合适的。
【解决方案3】:

较新版本的 Xcode 项目在构建调试版本时通常包含一个宏定义 DEBUG,因此最简单的方法是:

#ifdef DEBUG
NSLog(@"Safe and sound ...");
#endif

但这并不重要,根据我的经验,有时您不希望控制台吐出一堆日志,您可能只在某些情况下才需要它们。

【讨论】:

    【解决方案4】:

    这不是 NSLog 的行为吗?我以为这就是重点……

    【讨论】:

      猜你喜欢
      • 2012-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多