也许这将为某些人节省一个小时或几个小时的调试时间。在Swift中实现XML解析器,类似于Objective-C,看起来很简单:
private class Customparser : NSObject,NSXMLParser
{
// ... implement the parser protocol methods
}
...
let parser=NSXMLParser(data:data)
parser.delegate=CustomParser()
let success=parser.parse()这段代码会失败,并出现非常无用的运行时错误(访问不佳)。
发布于 2014-09-29 19:35:20
事实证明,主要问题是赋值给parser.delegate属性会立即触发自动引用计数释放,因为它是一个“赋值”属性。因此,如果读取器附加到不同的对象实例,则它的寿命足够长,可以实际执行其任务:
let reader=CustomParser()
let parser=NSXMLParser(data:data)
parser.delegate=reader
let success=parser.parse()事后看来,很难说它是否是一个bug,因为它与底层Objective-C框架的行为方式是一致的,但对于开始使用Swift的人来说,它肯定是这样的。
不过还有另一个问题:将解析器类声明为private不会导致任何编译器错误,但会导致运行时崩溃。去掉private修饰符就解决了这个问题。这是否意味着私有类的编译方式意味着它们不能被传递给其他代码块?
https://stackoverflow.com/questions/26098985
复制相似问题