【问题标题】:Swift: does capturing a function parameter, within a closure, hold it strongly?Swift:在闭包中捕获函数参数是否牢固地保持它?
【发布时间】:2016-09-06 11:59:54
【问题描述】:
在闭包中捕获函数参数
func someFunction(tableView: UITableView) -> (() -> ()) {
return { [weak self] in
self?.someOtherFunction() {
tableView.performTask()
}
}
}
如果是这样,在上面的示例中,确保 tableView 参数弱的语法是什么?
【问题讨论】:
标签:
ios
swift
memory-management
【解决方案1】:
默认情况下强闭包捕获参数。在最常见的闭包情况下,您访问在self 中声明的属性,而不捕获其他引用,因此将self 设为弱就足够了。在您的情况下,您需要扩展关闭捕获列表并将tableView 包含在其中:
func someFunction(tableView: UITableView) -> (() -> ()) {
return { [weak self, weak tableView] in
self?.someOtherFunction() {
tableView?.performTask()
}
}
}
您可以在ARC 文档中阅读有关捕获列表的更多信息:
您解决了闭包和类之间的强引用循环
例如,通过将捕获列表定义为闭包的一部分
定义。捕获列表定义捕获时要使用的规则
闭包体内的一个或多个引用类型。与两个类实例之间的强引用循环一样,您声明每个
捕获的引用是弱引用或无主引用,而不是
强参考。