NSLog在设备上,是一个问题还是我必须删除它?

时间:2011-06-20 04:52:55

标签: iphone objective-c nslog

我已阅读此帖:what happens to NSLog info when running on a device?

...但是想知道在分发应用程序时NSLog是否存在问题,例如填满内存还是什么?当我测试输入数据与数据库的一致性时,我只对它有兴趣。

原因是我有NSLog来控制何时在模拟器中将数据加载到我的数据库中。我上传时可以将其删除,但如果我不需要它会很好吗?

5 个答案:

答案 0 :(得分:7)

你应该删除它。例如,如果您记录UITableViewCell的内容(在-tableView:cellForRowAtIndexPath:中),它可以在性能上产生很大的不同,特别是在较慢的硬件上。

使用宏将NSLog输出保持在调试模式,但将其从释放模式中删除。可以在以下网站上找到一个示例:http://iphoneincubator.com/blog/debugging/the-evolution-of-a-replacement-for-nslog

答案 1 :(得分:5)

我在我的pch文件中使用了一组非常方便的宏。

有关详细信息,请参阅http://www.cimgf.com/2010/05/02/my-current-prefix-pch-file/

#ifdef DEBUG
  #define DLog(...) NSLog(@"%s %@", __PRETTY_FUNCTION__, [NSString stringWithFormat:__VA_ARGS__])
  #define ALog(...) [[NSAssertionHandler currentHandler] handleFailureInFunction:[NSString stringWithCString:__PRETTY_FUNCTION__ encoding:NSUTF8StringEncoding] file:[NSString stringWithCString:__FILE__ encoding:NSUTF8StringEncoding] lineNumber:__LINE__ description:__VA_ARGS__]
#else
  #define DLog(...) do { } while (0)
  #ifndef NS_BLOCK_ASSERTIONS
    #define NS_BLOCK_ASSERTIONS
  #endif
  #define ALog(...) NSLog(@"%s %@", __PRETTY_FUNCTION__, [NSString stringWithFormat:__VA_ARGS__])
#endif

#define ZAssert(condition, ...) do { if (!(condition)) { ALog(__VA_ARGS__); }} while(0)

答案 2 :(得分:3)

设备上的日志只保留了大约一个小时的数据,即使Apple的应用程序也记录了很多东西。因此,通常可以在日志中获得有意义的输出。

但是,由于日志记录是一个磁盘操作,您可能会发现过多的日志记录会降低您的应用程序的速度,因为写入会阻塞主要(= UI)线程一小段时间。

因此,您应该只记录提供更多信息的内容,如果您的应用中发生错误,以便找出问题所在。

答案 3 :(得分:1)

考虑切换到cocoalumberjack,它是NSLog的替代品,具有更多有用的功能和更好的性能。

  

它在概念上与其他流行的日志框架(如log4j)类似,但专门针对objective-c而设计,并利用了多线程,大中央调度(如果可用),无锁原子操作等功能,以及objective-c运行时的动态特性。

答案 4 :(得分:0)

唯一真正的理由是删除你的NSLog条目是通过运行不必要的代码来节省内存消耗,但除非你一致地添加数据,否则它不应该是一个太大的问题。 此外,如果用户遇到诸如应用程序崩溃等问题,则可以提交开发人员可以阅读的NSlog,以找出崩溃的原因。如果您正在使用大量不必要的数据加载NSlog,如果您需要通过所述日志查找用户的问题以解决问题,那么以后可能会很麻烦。

最终,我不会过分担心删除它们。无论如何,这是我的2美分。