生产构build中的冲击会导致崩溃
我在我的项目中有几个assert(condition, "message")
声明。
它们被用来检查开发过程中的不变条件。 我认为他们会被忽略在生产/发布版本(如在这个答案中所述 )。 他们不是。 相反,他们在TestFlighttesting期间导致崩溃。 当我评论断言应用程序不会崩溃。 有些东西通常会出错,但不会崩溃。
它可以是我的构build设置的东西?
我所有的归档scheme都使用发布configuration:
断言是在Cocoa Touch Framework项目中使用的,它是从自定义键盘扩展中使用的。
所有项目中的所有目标(Cocoa Touch Framework和带有键盘扩展目标的主项目)都有这些Build Settings:
Enable Foundation Assertions Debug YES Release NO Disable Safety Checks NO
怎么了?
编辑:
Sulthan的答案显示了如何禁用全局debugging和发布版本的断言。 那不是我所需要的。 我希望它按预期工作 – 断言应该在debugging中启用,但在发布版本中禁用。
默认情况下,它是以这种方式工作的,而且在我的主项目中也是这样工作的。 但是,对于位于从该主项目链接的Framework项目中的断言(在此问题中的详细信息)无效。 为什么? 如何解决它?
您尝试的选项:
Enable Foundation Assertions
在预处理部分(macros)。 Swift没有预处理,也没有使用macros。 该选项禁用Objective-C中常用的NSAssert
, NSParameterAssert
和类似的macros。
Disable Safety Checks
是一个性能选项:
默认情况下,标准库确保内存安全。 许多函数和方法logging了调用者必须满足的需求,例如数组索引是有效的; 即使违反了要求,内存安全也是有保证的。 但是,违反要求会触发运行时错误。 在其名称中包含“不安全”一词的API可让您在需要额外性能的地方明确禁用安全检查。 您有责任validation使用不安全API的代码的内存安全性。 如果multithreading代码中存在争用条件,则内存安全性也无法保证。
( Swift Library Reference)
你可能应该在这里尝试我的答案(在Other Swift Flags
使用-assert-config Release
)。
或者只保留生产版本中的断言。 每一个失败的断言都是一个错误,总的来说,最好尽快了解一个错误。