为了避免切换“调试过程”和“发布版本”中,输出NSLog和断言NSAssert删除和添加带来的麻烦,本文介绍一下如何妥善解决这个问题,即在发布版本中自动滤除NSLog和NSAssert,而在调试版本中不受影响。
思想:debug和release分别对应调试版本和发布版本,在debug下允许输出和断言,在release下不允许。
1.准备工作
利用Xcode自带的scheme区分debug和release
(1)新建scheme。在Xcode左上角,如下图所示,点击“New Scheme...”
弹出框如下图所示:点击OK即可,系统会自动命名为"xxx 2"形式。
新建后如下所示:
(2)设置debug和release
如上图所示,分别选中SQLite Persistence和SQLite Persistence 2,点击“Edit Scheme...”选项,设置"Build Configuration"分别为“Debug”和“Release”,如下图所示(以Release为例)
2.设置过滤NSAssert
分别设置预编译条件
(1)Debug: DEBUG=1(或DEBUG),表明在Debug状态下已定义DEBUG相当于 #define DEBUG,这个条件是为过滤NSLog准备的。
(2)Release: NS_BLOCK_ASSERTIONS,表明在Release状态下过滤NSAssert,只需要这一个条件就可以过滤断言NSAssert。
如下图所示
设置预编译Release: NS_BLOCK_ASSERTIONS还可以采用另外一个方法,如下图方法2所示(上面的方法是下图中的方法1的具体实现步骤)
3.设置过滤NSLog
(1)设置宏定义
在第2步的基础上(设置预编译DEBUG=1),在SQLite Persistence-Prefix.pch文件(xxx-Prefix.pch)最后添加NSLog的宏定义如下所示:
#ifdef DEBUG /* Debug NSLog() -> DNSLog() */
#define DNSLog(...) NSLog(__VA_ARGS__)
#else
#define DNSLog(...)
#endif
宏定义表明Debug(已经定义DEBUG=1)状态下自动调用NSLog输出,而在其他状态下不输出。
(2)调用
在调用输出时用DNSLog(@"xxx");代替NSL(@"xxx");语句,如下所示:
// 输出路径
DNSLog(@"directory: %@", documentsDirectory);
4.演示
(1)在Debug状态下运行,有输出如下所示
(2)在Release下运行,无输出,如下图
==================================
end