[英]swift retain cycle in function
我想問一下在這種情況下是否發生保留周期:
func someFunc() {
var aVar = SomeObj()
funcWithClosure(something, completionHandler: { _ -> Void in
aVar = SomeObj() // new
})
}
在這種情況下,我從閉包中重新引用aVar。 我只是想知道這是否會形成保留周期。 如果為true,我應該通過以下方式解決:
func someFunc() {
var aVar = SomeObj()
funcWithClosure(something, completionHandler: { [weak aVar] _ -> Void in
aVar = SomeObj() // new
})
}
不,不是。 閉包對aVar
擁有很強的引用,但是aVar
沒有對閉包的引用,因此沒有循環。
只是為了擴展您的問題,如果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
是弱weakVar
,因此在使用前需要以某種方式解開它。
在您的問題中,您建議將[weak aVar]
添加到閉包的捕獲列表中,我認為這不會起作用。
編輯:固定weakVar
為var
,這是一個關鍵字。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.