迅捷结构内存泄漏

finneycanhelp

我们正在尝试尽可能使用Swift结构。我们也使用RxSwift,它具有带闭包的方法。当我们有一个结构创建一个指向self的闭包时,就会创建一个强大的引用循环

import Foundation
import RxSwift

struct DoesItLeak {

    var someState: String = "initial value"
    var someVariable: Variable<String> = Variable("some stuff")

    let bag = DisposeBag()

    mutating func someFoo() {

        someVariable.subscribeNext { person in

            self.someState = "something"
        }
        .addDisposableTo(bag)
    }
}

我怎么知道 如果我创建100,000个DidItLeak对象并在每个对象上调用someFoo(),我相信我有100,000个具有强引用周期的对象。换句话说,当我删除包含这些对象的DoesItLeak数组时,这些对象将保留在内存中。如果我不调用someFoo(),就没有问题。

变量是一类。因此,我可以通过使用xcode的Instruments的分配并在Variable <String>中进行过滤来看到此内存问题

按变量过滤

在此处输入图片说明

如果我尝试使用如下所示的[weak self],则会出现编译器错误:

someVariable.subscribeNext { [weak self] person in

编译器错误为“弱不能应用于非类类型”

在实/非示例代码中,我们通过self访问方法和变量,这是一个内存问题。

如何在保持DoesItLeak结构的同时解决此内存问题?

谢谢你的帮助。

finneycanhelp

正如Darren在评论中指出的那样:“ DidItLeak不能成为结构体”我们不能DoesItLeak成为结构体并安全地解决强参考周期问题。

诸如struct之类的值类型存在于堆栈框架中。闭包和类是引用类型。

正如“封闭强大参考周期”部分所述

之所以会出现这种强烈的引用周期,是因为闭包(如类)是引用类型。

由于该结构具有Variable 该类,并且所引用的闭包使用来self存储到Variable该类中subscribeNext,因此它会创建强引用循环。请参阅自动参考计数Apple文档中的“解决关闭的强参考循环”

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章