在闭包中访问单例是否会导致保留循环?
特别像这个例子:
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 self
或 weak 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/