【问题标题】:Asserts are hit in production build causing crashes断言在生产构建中被击中导致崩溃
【发布时间】:2016-04-02 13:40:08
【问题描述】:

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

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

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

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

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

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

Enable Foundation Assertions
    Debug    YES
    Release  NO

Disable Safety Checks  NO

怎么了?


编辑:

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

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

【问题讨论】:

  • 你试过我的answer了吗?
  • @Sulthan 不,我没有。我认为不应该要求添加任何自定义标志来确保它忽略发布中的断言。我现在就试试。
  • 我也认为它不应该是必需的(它在第一个 beta 版本中是必需的)。
  • @Sulthan 请查看我的编辑 - 断言者的默认行为在框架中被破坏。

标签: ios xcode swift assert build-settings


【解决方案1】:

您尝试过的选项:

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

Disable Safety Checks 是一个性能选项:

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

(Swift Library Reference)

你应该试试我的回答here (在Other Swift Flags 中使用-assert-config Release)。

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

【讨论】:

  • 我应该把这些标志放在哪里?哪个项目,哪个目标?我知道那里的错误。它们很少见,很小,我计划在未来的版本中修复它们。断言导致的崩溃要严重得多。
  • @drasto 您必须将它们放入包含断言的项目和目标中。它只是一个编译器标志。
  • 它似乎不起作用 - 我将 -assert-config Debug 放入包含断言的项目(这是从另一个项目链接的框架项目),从 XCode 运行它,但断言仍然被命中
  • @drasto 你应该把Release放在那里,而不是Debug
  • 我想试试它是否有任何不同而无需存档、发布和下载 - 调试也应该在调试期间禁用断言,对吧?
猜你喜欢
  • 2022-08-07
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-27
  • 2014-06-09
相关资源
最近更新 更多