Swift:在一个闭包中捕获一个函数参数会强烈地保持它吗?

时间:2016-09-06 11:59:54

标签: ios swift memory-management

在闭包中捕获函数参数

func someFunction(tableView: UITableView) -> (() -> ()) {

    return { [weak self] in

        self?.someOtherFunction() {
            tableView.performTask()
        }

    }

}

如果是这样,在上面的例子中,确保tableView参数弱的语法是什么?

1 个答案:

答案 0 :(得分:1)

默认情况下强关闭捕获参数。在闭包的大多数常见情况下,您访问self中声明的属性,而不捕获其他引用,因此使self弱是足够的。在您的情况下,您需要展开闭包捕获列表并包含tableView

func someFunction(tableView: UITableView) -> (() -> ()) {
    return { [weak self, weak tableView] in
        self?.someOtherFunction() {
            tableView?.performTask()
        }
    }
}

您可以在ARC文档中了解有关捕获列表的更多信息:

  

您解决了闭包和类之间的强引用循环   实例通过将捕获列表定义为闭包的一部分   定义。捕获列表定义捕获时使用的规则   封闭体内的一个或多个引用类型。与两个类实例之间的强引用循环一样,您声明每个实例   捕获的引用是一个弱的或无主的引用而不是一个   强烈的参考。