关于断言的一些用法和坑
众所周知,我们在写代码的时候会写一些断言来发现调试阶段的一些异常情况,但是这些异常情况上线后是不应该展示给用户或者让用户感知到的。
通常使用 NSAssert
或基于它的宏。Xcode 4.2
之后在 release
模式下会自动将所有的 NSAssert
优化掉,也就是说,release
模式下,NSAssert
不会被编译到二进制文件中去,主要是通过这个宏 NS_BLOCK_ASSERTIONS
来实现的。
但是项目中接入的第三方库或者其它团队提供的库,无法保证他们也用 NSAssert
,写C语言的工程师一般是用 assert
来做断言处理,但是这里就来坑了。具体坑体现在以下两种情况:
assert
在release
下Xcode
是不会自动将这些断言移除,也就是会导致正式生产环境下会导致一些异常(崩溃)。我们可以通过Building Settings
-> 搜索“Preprocessor Macros”
找到release
模式,双击,然后添加,输入NDEBUG=1
即可。如图所示
- 说完第一个坑,又来到第二个,如果
pod
里面也有用到assert
,上述步骤对pod
无效。解决方案如图
就是 pod install
之后把每个 pod
的 target
的 release
模式添加 NDEBUG=1
。或者也可以在 podspec
里面添加对应的 GCC_PREPROCESSOR_DEFINITIONS
定义,不过由于是第三方库,可能不太方便(自己维护的 pod
另说)。
参考