【发布时间】: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 函数不允许捕获状态)。
我想正确创建这样的上下文,包括retain、release 和copyDescription 回调。
对于copyDescription,签名是
typealias CFAllocatorCopyDescriptionCallBack =
(UnsafePointer<Void>) -> Unmanaged<CFString>!
如何从 Swift 创建Unmanaged<CFString>! 实例,即如何将 Swift 字符串对象从 ARC 内存模型转移到外部管理的模型中?
【问题讨论】:
-
要正确回答您的问题,有些需要更多信息。 Unmanaged 是用于传播非托管对象引用的结构。我建议您查看swiftdoc.org/v2.1/type/Unmanaged 它的确切含义以及如何使用它。通常您可以执行对象的不平衡保留或不平衡释放,这取决于您的需要
-
鉴于回调的名称包括“复制”,我假设我必须使用 passRetained:clang.llvm.org/docs/…
-
Unmanaged.passRetained 看起来像答案:) 谢谢!
-
不客气!我不是投票者 :-) 我很高兴能帮助你...
标签: swift memory memory-management interop automatic-ref-counting