我想问一下在这种情况下是否会发生保留周期:
func someFunc() {
var aVar = SomeObj()
funcWithClosure(something, completionHandler: { _ -> Void in
aVar = SomeObj() // new
})
}
在本例中,我从闭包中引用了avar。我只是想知道这是否会产生一个保留周期。如果是,我应该通过以下方式解决:
func someFunc() {
var aVar = SomeObj()
funcWithClosure(something, completionHandler: { [weak aVar] _ -> Void in
aVar = SomeObj() // new
})
}
最佳答案
为了进一步讨论您的问题,如果aVar
强烈引用闭包,您将得到一个保留周期。例如:
func someFunc() {
var aVar = SomeObj()
aVar.funcWithClosure(something, completionHandler: {
doSomethingWith(aVar)
}
}
aVar
强烈引用闭包是因为它调用了函数,而闭包强烈引用了aVar
是因为它在其主体中使用了变量。要打破这个循环,可以在闭包外部创建一个弱引用aVar
,如下所示:func someFunc() {
var aVar = SomeObj()
weak var weakVar = aVar
aVar.funcWithClosure(something, completionHandler: {
if let weakVar = weakVar {
doSomethingWith(weakVar)
}
}
}
weakVar
referencesaVar
,因此您使用它来代替aVar
。并且它引用得很弱,所以当aVar
超出范围时(函数完成时),它的引用计数可以变为零。在闭包内部,由于weakVar
是一个弱的var,因此需要在使用之前以某种方式打开它。在您的问题中,您建议将
[weak aVar]
添加到闭包的捕获列表中,我认为这不起作用。编辑:固定解包为关键字。
关于swift - swift保留循环功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36057886/