如何知道在发布版本中是否禁用了NSAssert?

qic*_*ren 40 xcode objective-c ios

我经常在iOS代码中看到"断言",我谷歌它,并且知道它断言是真还是假.

我想知道这是否会在发布模式下自动禁用?

zap*_*aph 41

使用NSAssert()及其随附数.

在项目中定义NS_BLOCK_ASSERTIONS您的发布配置.

Xcode 4 NSAsserts在释放配置中对tremplates进行禁用.它补充道

-DNS_BLOCK_ASSERTIONS=1
Run Code Online (Sandbox Code Playgroud)

"释放"的"其他C标志".

从文档:

如果NS_BLOCK_ASSERTIONS定义了预处理器宏,则会禁用断言.

NSAssert宏评估条件并充当断言处理程序的前端.

每个线程都有自己的断言处理程序,它是类的对象NSAssertionHandler.调用时,断言处理程序会输出包含方法和类名(或函数名)的错误消息.然后它引发了一个NSInternalInconsistencyException例外.如果condition的计算结果为NO,则宏将调用handleFailureInMethod:object:file:lineNumber:description:当前线程的断言处理程序,并将desc作为描述字符串传递.

此宏应仅在Objective-C方法中使用.


Jef*_*eff 38

更新:已验证此功能也适用于Xcode 8.

在Xcode 7中,进入项目构建设置并在搜索栏中搜索"Assert".这显示"Apple LLVM 7.0 - 预处理"部分.有一个名为"Enable Foundation Assertions"的设置.

我从那里成功启用/禁用了NSAssert.

在此输入图像描述

  • 将"ENABLE_NS_ASSERTIONS = NO;"标志添加到应用程序的`AppName.xcodeproj/project.pbxproj`文件中 (2认同)

Rob*_*ier 27

我将在这里提供一个元答案:

@CocoaFu和@dasblinkenlight都是正确的.NS_BLOCK_ASSERTIONS关闭NSAssert()然后NDEBUG关闭assert().如果同时使用两者,则需要两者.

  • @NAlexN 您可以将它传递给其他 C 标志,但它将采用`-DNDEBUG=1` 的形式,使用 -D 来指定宏定义。 (2认同)

Rob*_*ert 7

正如扎普所说,-DNS_BLOCK_ASSERTIONS=1即将发布.但是,如果你想检查一下.

首先在文档中观察宏禁用NSAssertNS_BLOCK_ASSERTIONS.然后将其添加到构建并观察它符合ok:

#ifdef NS_BLOCK_ASSERTIONS
#error Error - NS_BLOCK_ASSERTIONS is defined
#endif
Run Code Online (Sandbox Code Playgroud)

然后将方案更改为释放(cmd - shift - <)

在此输入图像描述

然后观察构建失败.因此NS_BLOCK_ASSERTIONS定义意义NSAsserts被禁用.


das*_*ght 5

NDEBUG定义时,断言是从代码中有条件地编译出来的.如果NDEBUG=1在相应的构建设置部分中定义,则无论释放或调试模式如何,都将在代码中停用断言.