gpt4 book ai didi

swift - 将函数分配给保留闭包的对象时如何捕获值

转载 作者:搜寻专家 更新时间:2023-11-01 05:39:40 30 4
gpt4 key购买 nike

如果我有这样的类(class):

class Example {
var emptyBlock: (Void -> Void)?
var string: String = "Here's some string"
func someFunction() {
let string = self.string
print(string)
}
}

然后我在某个时候分配:

let variable: Void -> Void = exampleInstance.someFunction
exampleInstance.emptyBlock = variable

我是否有一个保留周期,因为 variablesomeFunction 捕获 exampleInstance 并且 variable 保留>exampleInstance?还是有某种魔法使这不是问题?

最佳答案

我做了一个快速测试,我相信我已经确认它们实际上是被怀疑的强烈捕获。我会将我的发现发布给有此问题的其他人:

取这个类,在deinit中断点:

class Example {
var emptyBlock: (Void -> Void)?
var string: String = "Here's some string"
func someFunction() {
let string = self.string
print(string)
}

deinit {
print("I was deinitialized") // Breakpoint Here
}
}

然后运行这两个代码示例:

引用周期

不会命中断点,因为无法取消初始化:

let exampleInstance = Example()
let variable = exampleInstance.someFunction
exampleInstance.emptyBlock = variable

非引用循环

因为每周捕获会遇到断点:

let exampleInstance = Example()
let variable: Void -> Void = { [weak exampleInstance] in exampleInstance?.someFunction() }
exampleInstance.emptyBlock = variable

因为当我们弱捕获时它会遇到断点,我们可以安全地得出结论,如果没有它,它会像闭包一样被强捕获。

在使用此工具时应考虑这一点,因为我们不会像声明闭包时那样获得同样明显的捕获。没有调用 self 来提醒我们的明确警告,并且在它们的范围内没有弱声明。

指南

我还在指南中找到了引用资料:

  • Global functions are closures that have a name and do not capture any values.
  • Nested functions are closures that have a name and can capture values from their enclosing function.
  • Closure expressions are unnamed closures written in a lightweight syntax that can capture values from their surrounding context.

关于swift - 将函数分配给保留闭包的对象时如何捕获值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32107353/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com