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

标签 iphone objective-c nslog

我在这个网站上被告知过几次,但我想确保情况确实如此。

我希望能够在我的代码中散布 NSLog 函数调用,并且 Xcode/gcc 会在构建我的发布/分发版本时自动删除这些调用。

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

最佳答案

预处理器宏确实非常适合调试。 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 对象交互来构建一个更复杂的日志系统。例如,您可以有一个日志记录类,它写入自己的日志文件(或数据库),并包含一个您可以在运行时设置的“优先级”参数,因此调试消息不会显示在您的发布版本中,但错误消息是 (如果你这样做了,你可以制作 DebugLog()、WarningLog() 等等)。

哦,请记住 #define DEBUG_MODE 可以在应用程序的不同位置重复使用。例如,在我的应用程序中,我使用它来禁用许可证 key 检查,并且只允许应用程序在某个日期之前运行。这让我能够以最小的努力分发一个时间有限的、功能齐全的测试版副本。

关于iphone - 真的不应该在生产代码上使用 NSLog() 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/300673/

相关文章:

iphone - 抛硬币平滑过渡

ios - Apples GameCenter 要求

iphone - 将 subview 添加到 UITableViewCell 问题

ios - 确定 crop rect 是否完全包含在旋转的 UIView 中

objective-c - 如何将 NSLog 的输出绑定(bind)(重定向?)到 IBOutlet 等?

iphone - 如何从 iPhone 查看日志?

iphone - 像动画一样使用 UIAlertVIew 添加 subview ,具有弹跳效果

iphone - 更改 UINavigationItem 颜色

ios - UIView BOOL 的奇怪行为

cocoa-touch - NSLog() 输出中方括号中的数字是什么?