我已阅读此帖:what happens to NSLog info when running on a device?
...但是想知道在分发应用程序时NSLog是否存在问题,例如填满内存还是什么?当我测试输入数据与数据库的一致性时,我只对它有兴趣。
原因是我有NSLog来控制何时在模拟器中将数据加载到我的数据库中。我上传时可以将其删除,但如果我不需要它会很好吗?
答案 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美分。