我使用Swift实现的NSXMLParser适用于iOS 8但不适用于7.1

时间:2014-08-20 02:16:06

标签: ios7 swift ios8

长话短说,我从RSS源中提取了一些数据,一切都运行良好。好吧,直到我决定在iOS 7.1模拟器上测试它。它马上就崩溃了。

这是我在ViewDidLoad中创建的XML Parser:

    var parser = NSXMLParser()
    var url: NSURL = NSURL.URLWithString("http://exampleURLforthisPost.com/?feed=rss2")

    parser = NSXMLParser (contentsOfURL: url)

    parser.delegate = self

    parser.shouldProcessNamespaces = false

    parser.shouldReportNamespacePrefixes = false

    parser.shouldResolveExternalEntities = false

    parser.parse()

它适用于iOS 8,但是当我使用iOS 7.1运行它时,在“parser = NSXMLParser(contentsOfURL:url)”行中指定了“EXC_BAD_ACCESS”错误。在运行iOS 7.1时,我应该指定一些不同的东西吗?

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

尝试

var parser : NSXMLParser! = NSXMLParser(contentsOfURL: url)

看起来NSXMLParser(contentsOfURL: url)可能会在错误情况下返回nil(例如无效的网址),因此您需要将其分配给可选值以避免解包nil值。

答案 1 :(得分:2)

我在ios8下遇到了同样的问题。但是,我有一个堆栈跟踪;

#0  0x000000010930b87c in CFStringCreateCopy ()
#1  0x000000010ae753d4 in Foundation._convertNSStringToString (ObjectiveC.NSString) -> Swift.String ()
#2  0x0000000108a3fffb in @objc Fuel_Locator.FuelWatchReader.parser (Fuel_Locator.FuelWatchReader)(ObjectiveC.NSXMLParser, didEndElement : Swift.String, namespaceURI : Swift.String, qualifiedName : Swift.String) -> () ()
#3  0x0000000108d2c6ad in _endElementNs ()
#4  0x0000000108b1dd96 in xmlParseEndTag2 ()
#5  0x0000000108b20424 in xmlParseTryOrFinish ()
#6  0x0000000108b1f4b0 in xmlParseChunk ()
#7  0x0000000108d299be in -[NSXMLParser parseData:] ()
#8  0x0000000108d29c1f in -[NSXMLParser parseData:] ()
#9  0x0000000108d29d7a in -[NSXMLParser parseFromStream] ()

这个结果并不好,因为它表明当解析器尝试制作从XML读取的NSString的快速副本时,问题就出现了。顺便说一下,只有在委托中调用didEndElement方法时才会发生这种情况。如果该方法不存在,则不会发生错误......但这几乎没有用。