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



在闭包中访问单例会导致保留周期吗?

具体来说,像这个例子:

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())
}

最新更新