簡體   English   中英

快速保持功能

[英]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]添加到閉包的捕獲列表中,我認為這不會起作用。

編輯:固定weakVarvar ,這是一個關鍵字。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM