当前位置:  开发笔记 > 编程语言 > 正文

是否应该在生产代码上使用NSLog()?

如何解决《是否应该在生产代码上使用NSLog()?》经验,为你挑选了6个好方法。

我在这个网站上被告知了几次,但我想确保确实如此.

我希望能够在我的代码中撒上NSLog函数调用,并且Xcode/gcc会在构建我的Release/Distribution版本时自动删除这些调用.

我应该避免使用它吗?如果是这样,有经验的Objective-C程序员之间最常见的选择是什么?



1> Marc Charbon..:

预处理器宏确实非常适合调试.NSLog()没有任何问题,但是使用更好的功能定义自己的日志记录功能很简单.这是我使用的,它包括文件名和行号,以便更容易跟踪日志语句.

#define DEBUG_MODE

#ifdef DEBUG_MODE
    #define DebugLog( s, ... ) NSLog( @"<%p %@:(%d)> %@", self, [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__] )
#else
    #define DebugLog( s, ... ) 
#endif

我发现将整个语句放在前缀头而不是自己的文件中更容易.如果需要,可以通过让DebugLog与普通的Objective-C对象进行交互来构建更复杂的日志系统.例如,您可以拥有一个写入其自己的日志文件(或数据库)的日志记录类,并包含您可以在运行时设置的'priority'参数,因此调试消息不会显示在您的发行版本中,但错误消息是(如果你这样做,你可以使DebugLog(),WarningLog()等.

哦,请记住,#define DEBUG_MODE可以在应用程序的不同位置重复使用.例如,在我的应用程序中,我使用它来禁用许可证密钥检查,并且只允许应用程序在特定日期之前运行.这让我可以轻松地分发一个时间有限,功能齐全的beta版本.


一个很好的答案,虽然我建议在你的"DEBUG_MODE"定义中使用个人前缀,例如将其称为"JPM_DEBUG"等.我经常遇到也使用DEBUG或DEBUG_MODE等的第三方代码,有时代码在DEBUG模式下无法正常工作.如果要打开第三方库调试,则应该有意识地执行此操作.(当然,它的库编写者应该为它们的符号加前缀,但许多C和C++框架都没有,特别是对于这个定义).
+1是一个很好的答案.我已经改变了我的意思,表明你的#define宏是要走的路,我希望OP切换接受的答案(我留给他一个评论).我正在使用虚函数,因为我不知道你可以在宏中使用...参数.生活和学习!
当日志记录语句仅使用中间变量来计算要记录的值时,此方法会导致编译器在发布模式下出现虚假的"未使用变量"警告.如果你像我一样厌恶编译器警告,那么最明智的方法是避免这种情况?

2> 小智..:

将这3行放在-prefix.pch文件的末尾:

#ifndef DEBUG
  #define NSLog(...) /* suppress NSLog when in release mode */
#endif

您无需在项目中定义任何内容,因为DEBUG在创建项目时默认情况下会在构建设置中定义.


最好的解决方案.您需要从XCode 6手动添加prefix.pch.

3> Matthew Schi..:

NSLog调用可以留在生产代码中,但只应存在于真正特殊情况下,或者需要将其记录到系统日志中的信息.

丢弃系统日志的应用程序很烦人,并且是不专业的.


对不起 - 对谁来说是不专业的?谁可能会在已发布的应用上检查您的日志并根据此判断您的专业性?(很明显,我完全同意你不应该在你的应用程序的发布版本中保留大量的NSLog,但我对'专业性'的论点感到困惑.)
其他开发人员会对你做的事情感到恼火.Android有类似的问题,一些开发人员真的很糟糕https://plus.google.com/110166527124367568225/posts/h4jK38n4XYR

4> ohhorob..:

我无法对Marc Charbonneau的答案发表评论,所以我会将此作为答案发布.

除了将宏添加到预编译头中之外,还可以使用Target构建配置来控制定义(或缺少定义)DEBUG_MODE.

如果选择" 调试 "活动配置,DEBUG_MODE将定义,宏将扩展为完整NSLog定义.

选择" Release "活动配置将不会定义,DEBUG_MODE并且发布版本中将NSLog省略您的ging.

脚步:

目标>获取信息

构建标签

搜索"预处理器宏"(或GCC_PREPROCESSOR_DEFINITIONS)

选择配置:调试

编辑此级别的定义

DEBUG_MODE=1

选择配置:发布

确认DEBUG_MODE未设置GCC_PREPROCESSOR_DEFINITIONS

如果省略定义中的'='字符,则会从预处理器中收到错误

此外,将此注释(如下所示)粘贴到宏定义上方,以提醒您DEBUG_MACRO来自定义的位置;)

// Target > Get Info > Build > GCC_PREPROCESSOR_DEFINITIONS
// Configuration = Release: 
//               = Debug:   DEBUG_MODE=1



5> e.James..:

编辑:Marc Charbonneau发布的方法,并由sho引起我的注意,远比这个好.

我删除了我的答案部分,建议在禁用调试模式时使用空函数禁用日志记录.处理设置自动预处理器宏的部分仍然相关,因此它仍然存在.我还编辑了预处理器宏的名称,以便它更符合Marc Charbonneau的答案.


要在Xcode中实现自动(和预期)行为:

在项目设置中,转到"构建"选项卡,然后选择"调试"配置.找到"预处理器宏"部分,并添加一个名为的宏DEBUG_MODE.

...

编辑:请参阅Marc Charbonneau的答案,了解使用DEBUG_MODE宏启用和禁用日志记录的正确方法.



6> August..:

我同意马修的观点.生产代码中的NSLog没有任何问题.实际上,它对用户有用.也就是说,如果您使用NSLog的唯一原因是帮助调试,那么,是的,应该在您发布之前将其删除.

此外,由于您已将此标记为iPhone问题,因此NSLog会占用资源,这是iPhone几乎没有的东西.如果你NSLogging 东西在iPhone上,从您的应用程序带走处理器时间.明智地使用它.

推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有