我想问一下在这种情况下是否会发生保留周期:

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)
        }
    }
}

weakVarreferencesaVar,因此您使用它来代替aVar。并且它引用得很弱,所以当aVar超出范围时(函数完成时),它的引用计数可以变为零。在闭包内部,由于weakVar是一个弱的var,因此需要在使用之前以某种方式打开它。
在您的问题中,您建议将[weak aVar]添加到闭包的捕获列表中,我认为这不起作用。
编辑:固定解包为关键字。

关于swift - swift保留循环功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36057886/

10-09 07:53