我想询问在这种情况下保留周期是否发生:
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
})
}
答案 0 :(得分:5)
不,它没有。闭包含有aVar
的强引用,但aVar
没有引用闭包,因此没有循环。
答案 1 :(得分:0)
只是为了扩展您的问题,如果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
引用aVar
,因此您可以在aVar
的位置使用它。并且它弱引用它,因此当aVar
超出范围时(当函数完成时),其引用计数可以变为零。在闭包内部,由于weakVar
是一个弱变量,需要在使用前以某种方式展开它。
在您的问题中,您建议将[weak aVar]
添加到闭包的捕获列表中,我认为这不会起作用。
编辑:修正了将weakVar
解包为var
,这是一个关键字。