【问题标题】:Disallow NSLog to be used禁止使用 NSLog
【发布时间】:2013-04-17 20:14:59
【问题描述】:

是否可以禁止使用NSLog,这样如果在编译时使用就会报错? 理想情况下,某种带有不允许的方法名称的编译器标志?

谢谢

【问题讨论】:

  • 出于好奇,为什么?
  • @TRedman - 我正在阅读“学习核心音频”一书 - 有一个脚注说作者无法弄清楚为什么他的代码没有运行,他重新整理了 NSLog 并发现代码有效,结果证明是速度问题。
  • 这个问题很有趣,但本书作者应该尝试在他的代码中找到一个实际问题。例如像这样的混乱比较:BOOL byes = YES; NSLog(@"%@", (byes = NO) ? @"N" : @"Y"); - 注意没有比较运算符,byes 在这个 NSLog 之后是 NO

标签: ios objective-c nslog


【解决方案1】:

如果您将NSLog(也许还有NSLogv)重新声明为

void NSLog(NSString *format, ...) UNAVAILABLE_ATTRIBUTE;
void NSLogv(NSString *format, va_list args) UNAVAILABLE_ATTRIBUTE;

在您的预编译头文件中,您会收到一条很好的错误消息:

main.m:199:3:错误:“NSLog”不可用 NSLog(@"%@", s1); ^

您甚至可以提供自定义错误消息(在 Clang 文档的 Messages on deprecated and unavailable Attributes 中找到):

void NSLog(NSString *format, ...) __attribute__((unavailable("You should not do this!")));
main.m:202:3:错误:“NSLog”不可用:你不应该这样做! NSLog(@"%@", s1); ^

【讨论】:

  • 我想给我的代码的用户一个我为什么这样做的理由,我是否可以这样做,或者我应该在这一行上方发表评论?
【解决方案2】:

在您的前缀标题中:

#define NSLog(x, ...) (__please_dont_use_NSLog__)

【讨论】:

    【解决方案3】:

    试试这个!

     #ifdef DEBUG
     #   define NSLog(...) NSLog(__VA_ARGS__)
     #else 
     #   define NSLog(...)
     #endif
    

    可以在这里找到解决方案:Enable and Disable NSLog in DEBUG mode

    希望这有帮助!

    【讨论】:

    • 如果使用 NSLog 不会产生错误,它只会使 NSLog 输出静音。
    猜你喜欢
    • 2011-02-07
    • 1970-01-01
    • 2011-09-26
    • 2015-01-09
    • 1970-01-01
    • 2013-04-06
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多