2010-02-05 34 views
7

我刚刚提交我的第一个iPhone应用程序。可以使用NSLog语句提交iPhone应用程序二进制文件吗?

我已经放了很多NSLog语句来测试和调试应用程序。

所以我的问题是“是否可以保持的NSLog声明在源代码”

,我有一个疑问,NSLog的声明是否会减慢总执行时间或没有。

谢谢。

+1

查看http://stackoverflow.com/questions/300673/is-it-true-that-one-should-not-use-nslog-on-production-code – Vladimir 2010-02-05 14:19:22

回答

9

我用这一切的时候(发现它的地方):

// DLog is almost a drop-in replacement for NSLog to turn off logging for release build 
// 
// add -DDEBUG to OTHER_CFLAGS in the build user defined settings 
// 
// Usage: 
// 
// 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(__FORMAT__, ...) NSLog((@"%s [Line %d] " __FORMAT__), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__) 
#else 
# define DLog(...) do {} while (0) 
#endif 
// ALog always displays output regardless of the DEBUG setting 
#define ALog(__FORMAT__, ...) NSLog((@"%s [Line %d] " __FORMAT__), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__) 

的three20项目从Facebook已经调试或日志记录更复杂的方式。

+0

你能告诉你在哪里找到它吗,所以我可以更好地理解它 – harshalb 2010-02-06 08:54:17

+0

对不起。我忘了它在哪里。 但是,源代码足够描述。你可以谷歌它。如果我能找到它,你可以。 – 2010-02-06 16:27:46

+1

这是从这个博客 - http://iphoneincubator.com/blog/debugging/the-evolution-of-a-replacement-for-nslog – deanWombourne 2010-02-08 09:40:47

3

的三个应用程序我已经在AppStore上都装有NSLogs所以我想这没关系......

2

我从来没有摆脱雷:)

有人建议有条件的编译器/编译器宏所以你可以在没有任何NSLog的情况下进行构建,但是我认为这样做很费力,而且奖励很少。但是,NSLog确实会减慢应用程序的运行速度(略),所以我会删除任何直接影响性能的应用程序。此外,您可能要删除一些调试日志信息隐藏你如何执行你的应用程序等

希望这是有帮助的,

山姆

+0

好的答案,但我不确定“我认为这样付出的回报太少了。”一旦你完成了这个工作,当你建立一个新项目时,再次实施并不困难(最多需要5分钟)。我个人有一个DebugLog定义,有条件地编译为发布版本,没有任何内容,让我使用NSLog用于真正重要的东西,我想在日志中显示。 – Kevin 2010-02-05 14:50:13

+0

根据NSLog的数量和内容,减速可能会相当大。如果您在表格中记录每个对象的描述,您可能会看到较差的滚动性能。 – FelixLam 2010-02-05 15:01:33

+0

@KevinBlair - 非常真实,但我必须编写宏,然后我所在的团队都需要采用宏 - 我走的是阻力最小的路径:)(如果有的话,每个新项目都内置一个预先定义的宏) – deanWombourne 2010-02-05 15:55:09

6

的应用我工作perviously了许多NSLogs倾销调试到控制台。我们发现它们严重阻碍了iPhone 3G的性能。在3GS上,性能受到显着影响,但并不如此。

我的建议是使用预处理器宏和调试预处理器定义在调试版本中有条件地使用NSLog,但在发布版本中不使用。

1

我只是使用“useDebugMode”singleton int设置为0或1,存储在userPrefs(plist)中。并且,根据iPhone的UUID,我添加一个“使用调试模式:开/关”切换到设置屏幕,以便我可以使用生产版本调试未来的问题。这让我可以调试数据问题(使用下载的XML),如果有人抱怨未来该计划的问题。然后我用所有“的NSLog” S和“printf的” S在

if (useDebugLog == 1) 
{ 
    NSLog(@"debug statement"); 
} 

这对我的作品......当然,:

if (useDebugLog == 1) 

导致一些开销我愿意处理。

0

它不是在Release中使用NSLog的问题。但是,如果您将任何有价值的数据放在日志中,其他用户(开发人员)可以看到该数据像一些下载链接等。

2

XCode4提供了一个非常简洁的解决方案 - 使用断点。 选择操作'记录消息'并设置val = @ val @作为消息, 然后勾选'评估操作后自动继续'框。

不适合每个使用案例,但它可以让您轻松检查值的“ ”,并保证它们不会成为发行版。

+0

似乎很好的一个。谢谢 。 – harshalb 2011-07-18 11:09:24

相关问题