swift - 在闭包中访问单例 = 内存泄漏?

标签 swift asynchronous closures retain-cycle

在闭包中访问单例是否会导致保留循环?

特别像这个例子:

class TheSingleton
{
    static let shared = TheSingleton() //THE SINGLETON

    enum Temperature              //An associated enum
    {
        case cold, hot
    }

    var currentTemp: Temperature? //A non-class-type variable
    var aPicture: UIImage?        //A class-type variable

    func giveMeFive() -> Int      //A function
    {
         return 5
    }

    //Pay attention to this
    func doSomething(onDone: @escaping (Int) -> ())
    {
         OtherSVC.upload("Mr. Server, do async stuff plz") { (inImage) in
             TheSingleton.shared.currentTemp = .cold
             TheSingleton.shared.aPicture = inImage
             onDone(TheSingleton.shared.giveMeFive())
         }
    }
}
//Fire the thing
TheSingleton.shared.doSomething { _ in}

如果是这样,我真的不知道如何为此编写捕获列表...

[weak TheSingleton.shared] (inImage) in

你不能那样做^

我包含了三个案例,因为可能数据类型很重要? 我认为我缺少有关捕获列表和闭包保留周期的一些基础知识。

我所知道的是,每当你访问闭包花括号之外的东西时,如果它是一个类类型的对象,你就必须取消拥有/弱化它。 这是因为闭包默认创建强引用。

我以为我可以厚颜无耻地通过在闭包中调用整个单例来绕过保留周期,但我可能因为视而不见而变得愚蠢。

一个解决方案是做这样的事情:

var updateDis = TheSingleton.shared.aPicture
OtherSVC.upload("ugh this is lame, and more work") { [unowned updateDis] inPic in 
    updateDis = inPic
}

?

最佳答案

由于您正在编写单例,TheSingleton.shared 几乎总是与 self 相同,因此捕获 unowned selfweak self 代替。我在这里更喜欢 weak,因为 self 几乎总是由类保留,并且只有在应用程序终止时才会被释放。

OtherSVC.upload("Mr. Server, do async stuff plz") { [unowned self] (inImage) in
    self..currentTemp = .cold
    self.aPicture = inImage
    onDone(self.giveMeFive())
}

关于swift - 在闭包中访问单例 = 内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50656436/

相关文章:

node.js - 对未知 URL 数量的异步 GET 请求

grails - Grails Controller 中 Action 和方法的区别

javascript - 在 jQuery 插件的属性中未定义对对象方法的引用

ios - 选择弹出按钮清除 UI 文本字段

ios - Twitter Api 返回不准确的 24 小时时间?在 swift 4 中解析

iOS:显示带有多个图像的长文章的最佳方式

python - 在 Python 3 中使用装饰器的结果(对我来说)令人困惑

ios - 使用核心数据的具有多个部分的 Diffable 数据源

sockets - golang 套接字在 Write() 方法返回之前不发送所有字节

javascript - 在 Node 中执行回调