gpt4 book ai didi

swift - 快速捕获功能列表

转载 作者:行者123 更新时间:2023-11-28 14:09:41 24 4
gpt4 key购买 nike

当使用闭包时,我们可以通过对捕获列表使用weakunowned 来避免强引用循环

我知道函数也是一个命名闭包。所以我猜想函数也会从上下文中捕获值。

如何避免函数的强引用循环

代码如下

class Person {
var name: String?

func printInfo() {
print(self.name ?? "nil")
}

deinit {
print("\(self.name ?? "") is deinitialized.")
}
}

var p1: Person? = Person()
p1?.name = "Person1"

var printFunction = p1?.printInfo
p1 = nil

不打印任何消息

...
p1 = nil
printFunction = nil

print Person1 已取消初始化。

有没有人能解决这个问题?在 closure 情况下,我们有 weakunowned 捕获列表。

最佳答案

您可以用闭包替换该方法。

class Person {
var name: String?

lazy var printInfo = { [unowned self] in
print(self.name ?? "nil")
}

deinit {
print("\(self.name ?? "") is deinitialized.")
}
}


var p1: Person? = Person()
p1?.name = "Person1"

var printFunction = p1?.printInfo

p1 = nil

此代码打印 - Person1 已取消初始化。

lazy 确保对属性的访问恰好发生在实例初始化之后,所以 self 肯定存在,我们可以在闭包中使用 self body 。如果您需要更多信息,请阅读有关 ARC 的信息 - https://docs.swift.org/swift-book/LanguageGuide/AutomaticReferenceCounting.html

关于swift - 快速捕获功能列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52700069/

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