swift保留循环功能

时间:2016-03-17 10:31:35

标签: swift function cycle retain

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

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

2 个答案:

答案 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,这是一个关键字。