【问题标题】:Regular expression for turning NSLogs on and off?打开和关闭 NSLogs 的正则表达式?
【发布时间】:2012-02-07 10:58:54
【问题描述】:

我有一个大型 Xcode 项目,其中包含几十个 NSLog,其中一些已被注释掉。

Xcode 中的查找/替换有一个正则表达式选项,所以我怎样才能让它注释掉所有活动的 NSLog,以便另一个查找/替换可以再次打开它们。所以,初始代码是:

//NSLog(@"one");
NSLog(@"two");

在正则表达式查找/替换之后变为:

//NSLog(@"one");
//**NSLog(@"two");

重新打开的变成:

//NSLog(@"one");
NSLog(@"two");

【问题讨论】:

  • 我想你已经回答了你自己的问题。要打开它们,只需查找并替换 '//**NSLog'
  • 不,这不会留下现有的评论 NSLogs
  • @cannyboy:如果你开启了正则表达式,你需要转义星号//\*\*NSLog
  • Max 和 JeremyP,我想你不明白。现有的已注释掉的 NSLog 不应更改。

标签: iphone objective-c ios regex xcode


【解决方案1】:

有一个更好的解决方案。只需将其放入您的 prefix.pch 文件中:

//disable logging when not in debug
#ifndef DEBUG
#undef NSLog
#define NSLog(args, ...)
#endif

当您的应用未处于调试模式时,这将禁用 NSLogs。这样您就不必从代码中实际删除它们,但它们不会对性能产生影响。

如果您想知道它是如何工作的,它会在未定义 DEBUG 宏时将 NSLog() 函数重新定义为空白。默认情况下,DEBUG 仅针对调试项目定义。如果您愿意,只需将第一行替换为 #if SOME_OTHER_CONDITION 即可将其更改为以不同方式打开和关闭。

【讨论】:

  • +1 @nick 毫无疑问这是一个很好的解决方案,但你不认为 NSLog 是一个函数而不是宏
  • 这不是理论上的解决方案——我经常使用它。 NSLog 是一个函数,您可能是对的,但是取消定义它并重新定义为宏可以正常工作。
  • 我认为#define NSLog(...) (void)0 会更好一些。这可以防止编译器警告并使您的代码更加理智 - (void)0 比虚无更接近实际语句。
  • @NickLockwood 是的,我告诉过你,你的代码运行良好,这就是我支持它的原因,但我对 nslog 作为宏感到困惑
  • 我已经更新了我的答案以澄清它是一个函数,而不是一个宏。
【解决方案2】:

对此更好的解决方案是使用 DLog 之类的宏,您可以使用调试(或您自己的编译器标志)来控制它。检查此linkthis

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    • 2014-01-04
    • 2015-04-27
    • 2011-05-13
    相关资源
    最近更新 更多