作为一个非科班的码农,debug时唯一的一招就是print()
。我不是NSLog()
党,而且自从用上了Xcode 8、设置了OS_ACTIVITY_MODE = disable
后,NSLog()
就更不常用了。
不过可以知道的是,NSLog()
在发布版本的App中,是会被编译器优化而去掉的。
更新:有同学指出,NSLog()也并不会因为Release Build而被优化。我刚刚做了个小实验,也证实了这一点。请看最后的验证测试。
问题是print()或debugPrint()也会被优化吗?
其实是不会的(笑)。
如果你每次网络请求完,都习惯性地print一下json,或fetch完图片print一下,这些都其实会吃一部分性能。打开Time Profiler,你就会发现性能还是有一定比重的损耗的。
好吧,我把所有的print()就都注释掉!!
算了吧还是,想想都不靠谱。作为一个使命是解放生产力的码农,怎么能做这么二的事情?
解决方案来了
以下是我们的老朋友喵神onevcat给的解决方法,原文请戳这里。我们的目的是在开发环境中print,且在发布的构建中不print。
第一步:设置DEBUG Flag。
第二步:封装print方法。之所以加上@autoclosure
,是因为想延迟对传入的表达式的计算,以进一步优化性能。
func dPrint(@autoclosure item: () -> Any) {
#if DEBUG
print(item())
#endif
}
完成啦。在项目中,用dPrint()
来替代print()
吧。在Release的版本构建中,开启了Whole Module Optimization
后,dPrint()
是一个空方法,没有实现,Swift编译器会自动忽略它,运行时也就不会执行这行dPrint()
了。
验证测试
过程很简单,不啰嗦了。使用Time Profiler + 真机测试,可以看出,NSLog()
方法是有调用的。如果想省下这笔开销,自己封装一下NSLog()
,或直接用dPrint()
吧~