6

作为一个新手程序员,我发现了NSlog. 它对调试非常有帮助(与 一起NSZombieEnabled)。

当它打印出所有这些东西时,我可以看到模拟器上的明显性能受到影响。我不认为我在设备上看到任何这样的打击,但我不确定。

那么,留下所有东西需要花费什么NSLogs吗?它是否在设备上使用更多内存?还是编译器只是忽略它们,就像我为设备编译时那样做注释?

编辑:

根据来自的建议,这是我实施的rano.

在我的App_Prefix.pch文件中,我添加了:

// DLog is almost a drop-in replacement for NSLog
// DLog();
// DLog(@"here");
// DLog(@"value: %d", x);
// Unfortunately this doesn't work DLog(aStringVariable); you have to do this instead     DLog(@"%@", aStringVariable);
#ifdef DEBUG
#   define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
#else
#   define DLog(...)
#endif

// ALog always displays output regardless of the DEBUG setting
#define ALog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);

然后在我的Project Info检查器中,对于Debug配置,在标题下,GCC 4.2 - Preprocessing,我将值添加DEBUG到名为的顶部条目中,Preprocessor Macros.

像魅力一样工作 -DLog当我构建一个Debug版本并ALog始终输出时输出。

4

3 回答 3

7

NSLog肯定比简单的更昂贵printf,但更集成到 Objective-C 和 Cocoa 框架中。

顺便说一句,当您认真编程时,您会注意到它不足以满足您的大多数需求。查看这篇文章及其参考资料,了解如何以智能方式替换它。

这样,您也可以让编译器在它不再有用时忽略它(例如,当您将发布一段代码时)。一般来说,您可以#ifdef在计算密集的代码循环/序列时调用日志函数。

于 2010-11-08T22:33:48.720 回答
0

NSLog没有作为宏实现,所以肯定会有成本。量化它并决定它是否重要更难。唯一可靠的方法是测量您自己的应用程序。

于 2010-11-08T22:35:12.460 回答
0

上面的答案已经过时了。您应该简单地使用CocoaLumberjack比 NSLog 优越得多,并且提供比上述答案更多的功能。

于 2013-01-02T02:57:02.220 回答