9

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

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

这可能与我的构建设置有关吗?

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

在此处输入图像描述

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

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

Enable Foundation Assertions
    Debug    YES
    Release  NO

Disable Safety Checks  NO

怎么了?


编辑:

Sulthan 的回答显示了如何为调试和发布版本全局禁用断言。那不是我需要的。我希望它按预期工作 - 断言应该在调试中启用,但在发布版本中禁用。

默认情况下,它以这种方式工作——它在我的主项目中也以这种方式工作。但它不适用于位于与该主项目链接的框架项目中的断言(此问题中的详细信息)。为什么?如何解决?

4

1 回答 1

2

您尝试过的选项:

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

Disable Safety Checks是一个性能选项:

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

( Swift 库参考)

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

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

于 2016-04-02T14:16:32.893 回答