前言
在Swift中,ENABLE_NS_ASSERTIONS
被忽略,并且断言是打开还是关闭取决于SWIFT_OPTIMIZATION_LEVEL
,see here for more information。
assert()
对-Onone
有效assertionFailure()
在以下时间处于 Activity 状态-Onone
precondition()
对于-Onone
和-O
处于 Activity 状态preconditionFailure()
可用于-Onone
,-O
和-Ounchecked
fatalError()
可用于-Onone
,-O
和-Ounchecked
我想要达到的目标
调试和Beta构建应具有断言启用,发布构建应具有断言禁用。
我该怎么做
我可以通过
precondition
方法在Swift中编写所有断言,然后使用-Ounchecked
标志编译Release版本,使用-O
标志编译beta版本。我不确定的是
iOS中Release版本的默认值为
-O
。有什么建议不要使用-Ounchecked
进行发行版本?这可能会导致其他哪些不良副作用? 最佳答案
您绝对应该而不是编译-Ounchecked
以便发布,以便仅在测试时使用precondition
。编译-Ounchecked
还会禁用对数组越界和展开nil
之类的检查,这可能会导致涉及内存损坏的一些非常讨厌的生产错误。
您可以通过-assert-config
的swiftc
参数来独立于编译器优化设置来控制断言行为:
$ 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 Build Settings开关,但是您可以使用“Other Swift Flags”设置进行添加。