使用Xcode 8.0 / Swift 3.0,我正在尝试为NSRegularExpression创建一个方便的init,但是当我尝试创建一个无效的正则表达式时我的应用程序崩溃了。我希望它会抛出一个错误,就像NSRegularExpression本身一样。
这是一个最小的测试用例。在命令行上,它只是对我大喊大叫,而不是崩溃。
$ xcrun swift
Welcome to Apple Swift version 3.0 (swiftlang-800.0.46.2 clang-800.0.38). Type :help for assistance.
1> import Foundation
2.
3. extension NSRegularExpression {
4. convenience init(foo: String, options: NSRegularExpression.Options) throws {
5. try self.init(pattern: foo, options: options)
6. }
7. }
8.
9. NSRegularExpression(foo: "(", options: [])
objc[63895]: NSRegularExpression object 0x100f01140 overreleased while already deallocating; break on objc_overrelease_during_dealloc_error to debug
$E0: NSError = domain: "NSCocoaErrorDomain" - code: 2048 {
_userInfo = 1 key/value pair {
[0] = {
key = "NSInvalidValue"
value = "("
}
}
}
我已经阅读了关于初始化,扩展和错误处理的“Swift编程语言(Swift 3)”章节,我不明白为什么这会过度释放。发生了什么事?
有没有办法为抛出的指定初始化程序编写这样的便利init,并自动(重新)抛出相同的错误?