首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift内存管理漏洞:边界情况、功能还是bug?

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

Stack Overflow用户
提问于 2014-09-29 19:35:20
回答 1查看 73关注 0票数 1

也许这将为某些人节省一个小时或几个小时的调试时间。在Swift中实现XML解析器,类似于Objective-C,看起来很简单:

代码语言:javascript
复制
private class Customparser : NSObject,NSXMLParser
{
    // ... implement the parser protocol methods
}

...

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

这段代码会失败,并出现非常无用的运行时错误(访问不佳)。

EN

回答 1

Stack Overflow用户

发布于 2014-09-29 19:35:20

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

代码语言:javascript
复制
let reader=CustomParser()
let parser=NSXMLParser(data:data)
parser.delegate=reader
let success=parser.parse()

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26098985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档