parser.parse() in Swift leads to EXC_BAD_ACCESS

2019-02-13 01:30发布

问题:

I'm following this tutorial as a jump start for an RSS feeder app I'm working on in Swift. I know there are some things that have changed in Swift since this tutorial, but none of them seem to explain why I'm having this issue.

Relevant Code (as far as I can tell) is as follows in my 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)

}

There doesn't seem to be a problem with the actual parser delegate methods as I put breakpoints on them and they aren't even being called before the crash.

My assumption is that it's a Swift bug, but I wanted to make sure I wasn't missing something before I go complaining to apple about it.

回答1:

There seems to be an error in the automatically translated headers that assumes that qualified name spaces are always used, however, since they can be nil sometimes, it crashes.

If you use:

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

by making the namespace and qualifiedName parameters implicitly unwrapped (or explicitly wrapped should work as well) you should be good to go.

You'll probably have to make similar changes for any delegate methods you provide that take namespaceURI or qualifiedName parameters.



回答2:

This bug is fixed in XCode Version 6.1 (6A1052c), in the same way @David has already suggested, but just for the record, it's fixed now.