生产构建中的断言会导致崩溃

Ras*_*sto 6 xcode assert build-settings ios swift

assert(condition, "message")我的项目中有几条陈述.

它们用于在开发期间检查不变条件.我认为在生产/发布版本中会忽略它们(如本答案中所述).他们不是.相反,它们会在TestFlight测试期间导致崩溃.当我评论断言时,应用程序不会崩溃.有些东西通常会出错,但不会崩溃.

可以用我的构建设置吗?

我的所有归档方案都使用发布配置:

在此输入图像描述

断言位于Cocoa Touch Framework项目中,该项目用于自定义键盘扩展.

所有项目中的所有目标(Cocoa Touch Framework以及具有键盘扩展目标的主项目)都具有以下构建设置:

Enable Foundation Assertions
    Debug    YES
    Release  NO

Disable Safety Checks  NO
Run Code Online (Sandbox Code Playgroud)

怎么了?


编辑:

Sulthan的答案显示了如何为调试和重新构建全局禁用断言.这不是我需要的.我希望它按预期工作 - 断言应在调试中启用,但在发布版本中禁用.

默认情况下它以这种方式工作 - 它也在我的主项目中以这种方式工作.但它不适用于从该主项目链接的Framework项目中的断言(此问题中的详细信息).为什么?怎么解决?

Sul*_*han 3

您尝试过的选项:

\n\n

Enable Foundation Assertions位于预处理部分(宏)。Swift 没有进行预处理,也不使用宏。此选项禁用NSAssert,NSParameterAssert以及 Objective-C 中常用的类似宏。

\n\n

Disable Safety Checks是一个性能选项:

\n\n
\n

默认情况下,标准库保证内存安全。许多函数和方法都记录了调用者必须满足的要求,例如数组索引有效;即使违反要求,内存安全也能得到保证。但是,违反要求可能会触发运行时错误。名称中包含 \xe2\x80\x9cunsafe\xe2\x80\x9d 一词的 API 可让您在需要额外性能的地方显式禁用安全检查。您有责任验证使用不安全 API 的代码的内存安全性。如果多线程代码中存在竞争条件,内存安全也无法得到保证。

\n
\n\n

Swift 库参考)

\n\n

您可能应该在这里尝试我的答案\n(-assert-config Release在 中使用Other Swift Flags)。

\n\n

或者只是将断言保留在生产版本中。每个失败的断言都是一个错误,通常最好尽快了解错误。

\n