在关闭中访问单身人士=内存泄漏?

时间:2018-06-02 11:27:21

标签: 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
}

1 个答案:

答案 0 :(得分:1)

由于您正在编写单身,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())
}