Swift内存管理漏洞:边界情况,功能还是bug?

时间:2014-09-29 11:35:20

标签: xml parsing memory swift

也许这会节省一个小时或几个调试时间。在Swift中实现类似于Objective-C的XML解析器似乎很简单:

private class Customparser : NSObject,NSXMLParser
{
    // ... implement the parser protocol methods
}

...

let parser=NSXMLParser(data:data)
parser.delegate=CustomParser()
let success=parser.parse()

此代码失败,实际上无用的运行时错误(访问不当)。

1 个答案:

答案 0 :(得分:0)

原来问题是,分配给parser.delegate属性会立即直接触发自动引用计数释放,因为它是一个'assign'属性。因此,如果读者附加到不同的对象实例,它的存在时间足以实际执行其任务:

let reader=CustomParser()
let parser=NSXMLParser(data:data)
parser.delegate=reader
let success=parser.parse()

事后看来,很难说它是否是一个错误,因为它与底层的Objective-C框架的行为方式一致,但对于以Swift开始的人来说,这似乎是肯定的。

还有另一个问题:将解析器类声明为私有不会导致任何编译器错误,但它会带来运行时崩溃。取出私有修饰符可以解决问题。这是否意味着私有类的编译方式意味着它们无法传递给其他代码块?