关于Objective C 在release模式下去除NSLog打印的log
当写App的时候,难免少不了印debug log的步骤,当印的多了,那么问题来了,NSLog其实是会浪费资源的,有兴趣的可以自行去查一下NSLog的故事。
那有没有一种方法可以做到,release 模式下不需要这些debug log,debug模式下保留这些debug log呢?
因为我们不想一个一个去注解掉。对吧@@
答案是有的。
其实资料网上可以找到很多,尝试之后,发现每篇文章都漏掉了最关键的设定步骤,你这让小白情何以堪呐,明明设定都跟你一样,我配置好了却不可以,生气气。
跟同事研究了一下,发现了那个漏掉的步骤,在这里写出来记录一下,如果刚好你也需要的话那就很好咯,不用客气😁。
如何实现
首先,讲一下pch文件,pch 全称是“precompiled header”,也就是预编译头文件,该文件里存放的工程中一些不常被修改的代码,比如常用的框架头文件,这样做的目的提高编译器编译速度。我们知道当我 们修改一个工程中某个文件代码时候,编译器并不是重新编译所有所有文件,而是编译改动过文件的,假如pch中某个文件修改了,那么pch整个文件里包含的 的其他文件也会重新编译一次,这样就会消耗大量时间,所以它里面添加的文件最好是是很少变动或不变动的头文件或者是预编译的代码片段;),这是PCH最常用的功能。
下面讲一下我们的需求实现,通过在pch文件中编译宏设定,来决定是否要执行code内部NSLog.
#ifdef DEBUG
#define NSLog(...) NSLog(__VA_ARGS__)
#define debugMethod() NSLog(@"%s", __func__)
#else
#define NSLog(...)
#define debugMethod()
#endif
上面的步骤解释:
在debug 模式下,指定NSLog会输出变量内容,在release 模式下编译器就不会编译,这样就达到我们想要的目的。 不注解NSLog的情况下,不输出执行NSLog从而节省资源。
配置部分:
设定一
首先你需要在你的project中添加pch文件,-->添加文件,往下面翻就会看到pch文件
点击next,勾上Targets到你的project,即创建完成,然后在这份文件中添加上面的宏定义内容即可。
设定二
在build setting里面,搜寻Prefix找到如下图地方,在Prefix Header这里右边的位置双击编辑下面的内容:
$(SRCROOT)/xxx/xxxx.pch
$(SRCROOT)-->定位到你的project path,后面跟你的project目录(包含pch的那层目录文件夹)
比如: $(SRCROOT)/MyProejct/testPrefixHeader.pch.
到这里,就大功告成了。
剩下最后一步,在build scheme里面,编辑,选择configure 为debug 或者release 来验证 NSLog是否执行打印动作。