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

我正在 Swift开发一个应用程序,我尽可能地使用值类型(结构体和枚举).根据苹果关于内存管理的文档,使用值类型不应该导致任何保留周期,它应该只是工作.

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

假设有一个协议Item定义了一个属性值:

protocol Item {

    var value: String { get }

}

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

struct FooItem<T>: Item {

    let value: String
    let additionalValue: T

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

}

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

struct ItemWrapper {

    let item: Item

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

}

如果使用“内存泄漏”配置在仪器中进行分析,则每次使用FooItem创建一个ItemWrapper值时,都会显示一个内存泄漏.

let item = FooItem(value: "protocol value",additionalValue: "foo item value")  
let _ = ItemWrapper(item: item)

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

整个代码示例可以在这个Gist:https://gist.github.com/lukaskubanek/4e3f7657864103d79e3a中看到

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

这是Swift编译器中的错误还是我做错了?

编辑1:正如在评论中所提到的,我在Apple Dev Forum上转载了这个问题,以便从Swift社区和潜在的语言开发人员中获得更多的关注.由于2015年WWDC期间开发论坛的迁移,我不得不在新论坛上发布更新的问题.这里是链接:https://forums.developer.apple.com/message/9643

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

编辑3:将问题全面更新为在Swift 2.0中持续存在的修改问题,并上传新的示例Xcode项目.

解决方法

嗯,这是一个解决方法,虽然我不知道为什么它的工作原理.我注意到,如果你这样做:
let theItem = itemWrapper.item
    let value = theItem.value

…而不是这样:

let value = itemWrapper.item.value

…它不会产生内存泄漏.

相关文章

当我们远离最新的 iOS 16 更新版本时,我们听到了困扰 Apple...
欧版/美版 特别说一下,美版选错了 可能会永久丧失4G,不过只...
一般在接外包的时候, 通常第三方需要安装你的app进行测...
前言为了让更多的人永远记住12月13日,各大厂都在这一天将应...