众所周知,我们在写代码的时候会写一些断言来发现调试阶段的一些异常情况,但是这些异常情况上线后是不应该展示给用户或者让用户感知到的。

通常使用 NSAssert 或基于它的宏。Xcode 4.2 之后在 release 模式下会自动将所有的 NSAssert 优化掉,也就是说,release 模式下,NSAssert 不会被编译到二进制文件中去,主要是通过这个宏 NS_BLOCK_ASSERTIONS 来实现的。 但是项目中接入的第三方库或者其它团队提供的库,无法保证他们也用 NSAssert,写C语言的工程师一般是用 assert 来做断言处理,但是这里就来坑了。具体坑体现在以下两种情况:

  1. assertreleaseXcode 是不会自动将这些断言移除,也就是会导致正式生产环境下会导致一些异常(崩溃)。我们可以通过 Building Settings -> 搜索 “Preprocessor Macros” 找到 release 模式,双击,然后添加,输入 NDEBUG=1 即可。如图所示

  1. 说完第一个坑,又来到第二个,如果 pod 里面也有用到 assert,上述步骤对 pod 无效。解决方案如图

就是 pod install 之后把每个 podtargetrelease 模式添加 NDEBUG=1。或者也可以在 podspec 里面添加对应的 GCC_PREPROCESSOR_DEFINITIONS 定义,不过由于是第三方库,可能不太方便(自己维护的 pod 另说)。

参考

  1. NSAssertionHandler
  2. NSAssert vs. assert: Which do you use, and when?