“已经解除分配的过度释放”

时间:2016-10-09 00:55:23

标签: swift automatic-ref-counting

使用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,并自动(重新)抛出相同的错误?

0 个答案:

没有答案