【问题标题】:Create Unmanaged<CFString> from Swift从 Swift 创建 Unmanaged<CFString>
【发布时间】:2016-03-09 15:52:13
【问题描述】:

从 Swift 2 开始,可以从 Swift 调用接受 C 回调的 C 函数,而无需中间包装器。

许多 C 事件处理 API 遵循您首先创建上下文的模式:

struct Context {
    CFIndex version;
    void *info;
    CFAllocatorRetainCallBack retain;
    CFAllocatorReleaseCallBack release;
    CFAllocatorCopyDescriptionCallBack copyDescription;
}

然后在注册我们的回调时将上下文传递给 C API。当接收到事件时,信息指针与事件一起传递给回调函数,允许我们恢复上下文状态(因为 C 函数不允许捕获状态)。

我想正确创建这样的上下文,包括retainreleasecopyDescription 回调。

对于copyDescription,签名是

typealias CFAllocatorCopyDescriptionCallBack = 
    (UnsafePointer<Void>) -> Unmanaged<CFString>!

如何从 Swift 创建Unmanaged&lt;CFString&gt;! 实例,即如何将 Swift 字符串对象从 ARC 内存模型转移到外部管理的模型中?

【问题讨论】:

  • 要正确回答您的问题,有些需要更多信息。 Unmanaged 是用于传播非托管对象引用的结构。我建议您查看swiftdoc.org/v2.1/type/Unmanaged 它的确切含义以及如何使用它。通常您可以执行对象的不平衡保留或不平衡释放,这取决于您的需要
  • 鉴于回调的名称包括“复制”,我假设我必须使用 passRetained:clang.llvm.org/docs/…
  • Unmanaged.passRetained 看起来像答案:) 谢谢!
  • 不客气!我不是投票者 :-) 我很高兴能帮助你...

标签: swift memory memory-management interop automatic-ref-counting


【解决方案1】:

查看问题 cmets。

let string = Unmanaged.passRetained("description")

【讨论】:

    猜你喜欢
    • 2015-01-26
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-25
    • 2014-07-28
    • 2021-02-13
    • 2014-08-31
    相关资源
    最近更新 更多