【问题标题】:parser.parse() in Swift leads to EXC_BAD_ACCESSSwift 中的 parser.parse() 导致 EXC_BAD_ACCESS
【发布时间】:2014-11-05 18:51:42
【问题描述】:

我正在关注this tutorial,作为我正在使用 Swift 开发的 RSS feeder 应用程序的起点。我知道自本教程以来 Swift 中发生了一些变化,但似乎都没有解释为什么我会遇到这个问题。

相关代码(据我所知)在我的 TableViewController 中如下所示:

 override func viewDidLoad() {
    super.viewDidLoad()

    let url:NSURL = NSURL(string: "my.url.string")
    parser = NSXMLParser(contentsOfURL: url)
    parser.delegate = self
    parser.parse() // <- Thread 1: EXC_BAD_ACCESS (code=1, address=0x0)

}

实际的解析器委托方法似乎没有问题,因为我在它们上设置了断点,并且在崩溃之前它们甚至没有被调用。

我的假设是这是一个 Swift 错误,但我想确保在向苹果抱怨之前我没有遗漏任何东西。

【问题讨论】:

  • 我很高兴大卫能够回答我的问题,即使我没有包含实际的 ParserDelegate 方法。要清楚;我原来的方法看起来像这样:func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String, qualifiedName qName: String, attributes attributeDict: [NSObject : AnyObject]) 现在看起来像这样:func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String!, qualifiedName qName: String!, attributes attributeDict: [NSObject : AnyObject]!) 再次感谢大卫!

标签: ios swift exc-bad-access nsxmlparser xcode6


【解决方案1】:

在假定始终使用限定名称空间的自动翻译标头中似乎存在错误,但是,由于它们有时可能为 nil,因此会崩溃。

如果你使用:

func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String!, qualifiedName qName: String!, attributes attributeDict: [NSObject : AnyObject]!)

通过使命名空间和qualifiedName 参数隐式解包(或显式包装也应该工作),你应该很高兴。

您可能必须对您提供的任何采用 namespaceURI 或qualifiedName 参数的委托方法进行类似的更改。

【讨论】:

  • 做到了!非常感谢。包装和展开可选的东西是我在 swift 中最难理解的东西。你知道某处可以帮助我确定的博客文章或教程吗?
  • +1 这完全救了我。我在解析一个非常好的 XML 字符串时看到了 EXC_BAD_ACCESS - 我更新了我的 didStartElementdidEndElement 委托方法以隐式解开 namespaceURIqNameattributeDict 参数,现在它正在工作伟大的。谢谢!
  • 我认为 attributeDict 不需要是可选的。可以肯定的是,在我的实验中,它总是至少是一个空字典。
  • 太棒了,拯救了我的夜晚!我还不明白为什么它会完全有效,但非常感谢!
【解决方案2】:

此错误已在 XCode 版本 6.1 (6A1052c) 中修复, 就像@David 已经建议的那样, 但只是为了记录,它现在已经修复了。

【讨论】:

    【解决方案3】:

    如果您现在在 2021 年遇到 EXC_BAD_ACCESS,请检查您是否在主 UI 线程中调用解析器。不要在网络回调中解析。这是我的情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-27
      • 2016-11-19
      • 2012-10-02
      • 2011-04-14
      • 2017-03-15
      • 2014-09-27
      相关资源
      最近更新 更多