swift - 快速捕获功能列表

标签 swift function closures automatic-ref-counting

当使用闭包时,我们可以通过对捕获列表使用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/

相关文章:

ios - 无法将 __SwiftDeferredNSArray 转换为 NSMutableArray

ios - 具有倍增效果的 Swift UIView

c - 错误: request for member ‘txt’ in something not a structure or union

c++ - 调用 C++ 函数并更改其参数(链表)

function - Clojure:使用宏或 def 的函数参数/签名

extjs - 如何正确地从另一个 Controller 或闭包调用 Controller 方法

objective-c - HDFC iOS SDK 崩溃以集成到 Swift 中?

ios - Swift - 为 NSExpression 创建自定义函数

javascript - 将 highcharts yAxis.tickPositioner 回调函数移至某个 util 函数之外

lisp - 在 Lisp 中如何调用函数列表中的函数?