Swift结构中的内存泄漏 - 如何解决这个问题?

Luk*_*nek 14 macos memory-leaks ios xcode7 swift2

我正在使用Swift 2(Xcode 7 beta 3)开发一个应用程序,我试图在可能的情况下使用值类型(结构和枚举).根据Apple关于内存管理的文档,使用值类型不应该导致任何保留周期,它应该正常工作.

但是今天我在事件处理代码中遇到了大量的内存泄漏.我追踪它并将问题减少到以下最小的例子.

假设有一个Item定义单个属性的协议value:

protocol Item {

    var value: String { get }

}
Run Code Online (Sandbox Code Playgroud)

然后,我们创建一个实现Item协议的具体结构,并添加一个额外的属性additionalValue.我们来调用结构FooItem.

struct FooItem<T>: Item {

    let value: String
    let additionalValue: T

    init(value: String, additionalValue: T) {
        self.value = value
        self.additionalValue = additionalValue
    }

}
Run Code Online (Sandbox Code Playgroud)

拼图的第三部分是另一个包含实现Item协议的项目的结构.它被称为ItemWrapper.

struct ItemWrapper {

    let item: Item

    init(item: Item) {
        self.item = item
    }

}
Run Code Online (Sandbox Code Playgroud)

如果使用Memory Leaks配置在Instruments中进行分析,则每次ItemWrapper使用a创建值时都会出现内存泄漏FooItem.

let item = FooItem(value: "protocol value", additionalValue: "foo item value")  
let _ = ItemWrapper(item: item) 
Run Code Online (Sandbox Code Playgroud)

仪器截图1 仪器截图2

以下是示例Xcode项目Instruments文件:https://www.dropbox.com/s/z6ugxzxqggrv1xl/SwiftStructsMemoryLeak.zip?dl=0

整个代码示例可以在此主旨来看:https://gist.github.com/lukaskubanek/4e3f7657864103d79e3a

这是错误报告:rdar:// 21375421

它是Swift编译器中的错误还是我做错了什么?


编辑1:正如评论中所建议的那样,我在Apple Dev论坛上重新提出了这个问题,以吸引更多来自Swift社区以及可能来自语言开发人员的关注.由于在WWDC 2015期间开发论坛的迁移,我不得不在新论坛上发布更新的问题.这是链接:https://forums.developer.apple.com/message/9643


编辑2:我最初在示例代码中发布的问题似乎在Swift 2.0中得到了解决.由于它没有解决我的应用程序中的问题,我对示例代码进行了另一次修改.现在,FooItem附加属性具有泛型类型,FooItem并使用类型进行注释,因此是泛型类型.这就是我在我的应用程序中使用它的方式,它仍然会导致内存泄漏,但这次ItemWrapper是在初始化时而不是在访问属性时.


编辑3:完全更新问题到修改后的问题,该问题在Swift 2.0中持续存在并上传了新的示例Xcode项目.

Luk*_*nek 4

虽然我在开发论坛和 bug 跟踪器中都没有得到 Apple 的回复,并且在最新 beta 版本的发行说明中也没有找到与此问题相关的任何内容,但它似乎在 Swift 编译器中得到了解决在Xcode 7 beta 5中。(也许它也适用于 beta 4。我检查的最后一个版本是 beta 3。)

演示项目不再产生内存泄漏。我的应用程序也是如此。耶!

在此输入图像描述