【问题标题】:Swift -Ounchecked and AssertionsSwift -Ounchecked 和断言
【发布时间】:2015-07-17 15:26:16
【问题描述】:

前言

在 Swift 中,ENABLE_NS_ASSERTIONS 被忽略,断言是打开还是关闭取决于 SWIFT_OPTIMIZATION_LEVELsee here for more information

  • assert()-Onone 有效
  • assertionFailure()-Onone
  • precondition()-Onone-O 有效
  • preconditionFailure()-Onone-O-Ounchecked 有效
  • fatalError()-Onone-O-Ounchecked 有效

我想要实现的目标

Debug 和 Beta Build 应该有断言启用,Release Build应该有断言disabled

我是怎么做到的

我可以通过precondition 方法在Swift 中编写我的所有断言,并使用-Ounchecked 标志编译发布版本,使用-O 标志编译beta 版本。

我不确定什么

iOS 中发布版本的默认值为-O。有什么建议不要将-Ounchecked 用于发布版本?这会导致哪些其他不良副作用?

【问题讨论】:

    标签: ios swift assert


    【解决方案1】:

    您绝对应该编译-Ounchecked 以供发布,以便仅在测试时使用precondition。编译 -Ounchecked 还会禁用对数组越界和展开 nil 等内容的检查,这可能会导致一些涉及内存损坏的非常讨厌的生产错误。

    您可以通过 swiftc-assert-config 参数独立于编译器优化设置来控制断言行为:

    $ cat assert.swift 
    assert(false, "assertion asserted")
    println("made it here...")
    $ swiftc -Onone assert.swift; ./assert
    assertion failed: assertion asserted: file assert.swift, line 1
    Illegal instruction: 4
    $ swiftc -O assert.swift; ./assert
    made it here...
    $ swiftc -O -assert-config Debug assert.swift; ./assert
    assertion failed: assertion asserted: file assert.swift, line 1
    Illegal instruction: 4
    $ 
    

    看起来没有为此设置 Xcode 构建设置切换,但您可以使用“Other Swift Flags”设置进行添加。

    【讨论】:

    • 触摸那个 :-)
    猜你喜欢
    • 1970-01-01
    • 2014-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-09
    • 1970-01-01
    • 1970-01-01
    • 2019-02-25
    相关资源
    最近更新 更多