【问题标题】:Is it possible to get the retain count of a Closure in Swift?是否有可能在 Swift 中获得闭包的保留计数?
【发布时间】:2020-09-02 18:32:37
【问题描述】:

在 Swift 中,闭包是引用类型。这意味着(我认为,如果我错了,请纠正我)他们的生命周期由保留计数管理。我可以使用CFGetRetainCount 获取对象的保留计数,但这不适用于闭包,因为它们不符合AnyObject(或任何与此相关的协议)。

在有人介入并告诉我通过尝试手动获取任何内容的保留计数而告诉我做错事之前,我知道。这纯粹是为了向我自己证明,这就是运行时管理 Closure 生命周期的方式。

【问题讨论】:

  • 您可以尝试在 Xcode 中使用 Memory Debug Graph,它可以直观地解释任何对象在任何时间点的保留计数
  • 提供了 swift 编译器和运行时的源代码。我建议阅读那个。或将其修改为 print() 一些诊断信息。

标签: swift closures automatic-ref-counting retaincount


【解决方案1】:

如果您将闭包声明为@convention(block),则可以使用CFGetRetainCount,因为这将指示编译器生成一个Objective-C块,该块对于所有预期目的都是一个对象:

let closure: @convention(block) () -> Void = {
    print("test")
}

print(CFGetRetainCount(unsafeBitCast(closure, to: CFTypeRef.self)))

【讨论】:

    猜你喜欢
    • 2022-01-07
    • 1970-01-01
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-03
    相关资源
    最近更新 更多