xml - Swift 内存管理漏洞 : boundary case, 功能或错误?

标签 xml parsing memory swift

也许这会为某人节省一个或几个小时的调试时间。在 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()

此代码因无用的运行时错误(错误访问)而失败。

最佳答案

事实证明,主要问题是直接分配给 parser.delegate 属性会立即触发自动引用计数释放,因为它是一个“分配”属性。因此,如果读取器附加到不同的对象实例,它的生命周期足以实际执行其任务:

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

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

但还有另一个问题:将解析器类声明为私有(private)不会导致任何编译器错误,但会导致运行时崩溃。去掉 private 修饰符就解决了问题。这是否意味着私有(private)类的编译方式意味着它们不能传递给其他代码块?

关于xml - Swift 内存管理漏洞 : boundary case, 功能或错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26098985/

相关文章:

android - 在 xamarin (c#) 中加载嵌入式 xml

php - 使用命名空间从 XML 中提取数据

android - Html.fromHtml() 删除回车符 "&#xD"、 "\n"

c - 如何正确获取一行并用 C 解析它

java - 内存计算器程序

xml - 大学类(class)的 XML 编码

java - 如何在Java中解析JSON

json - Swift 4 以变量为关键解析 json

c++ - valgrind 疯了还是这是真正的 std 映射迭代器内存泄漏?

从列表/字典中删除项目后,Python "sys.getsizeof"报告大小相同?