如何将自己投射到swift中的UnsafeMutablePointer类型

如何将自己投射到swift中的UnsafeMutablePointer类型,第1张

概述尝试将“self”传递给swift中的C函数,当调用以下代码时: var callbackStruct : AURenderCallbackStruct = AURenderCallbackStruct.init( inputProc: recordingCallback, inputProcRefCon: UnsafeMutablePointer<Void> 尝试将“self”传递给swift中的C函数,当调用以下代码时:
var callbackStruct : AURenderCallbackStruct =     AURenderCallbackStruct.init(      inputProc: recordingCallback,inputProcRefCon: UnsafeMutablePointer<VoID>    )

在这里将“self”转换为UnsafeMutablePointer类型的理想方法是什么?

对象指针(即引用类型的实例)可以是
转换为UnsafePointer< voID> (Swift 3中的const voID *,UnsafeRawPointer的Swift映射)并返回。在Objective-C中,你会写
voID *voIDPtr = (__brIDge voID*)self;// MyType *mySelf = (__brIDge MyType *)voIDPtr;

(有关这些的确切含义,请参阅Clang ARC文档中的3.2.4 Bridged casts
管型。)

Swift有一个非管理类型用于此目的。
使用它有点麻烦,因为它适用于copaquePointer
而不是UnsafePointer< VoID&gt ;.这里有两种帮助方法
(以Objective-C __brIDge演示命名):

func brIDge<T : AnyObject>(obj : T) -> UnsafePointer<VoID> {    return UnsafePointer(Unmanaged.passUnretained(obj).toOpaque())    // return unsafeAddressOf(obj) // ***}func brIDge<T : AnyObject>(ptr : UnsafePointer<VoID>) -> T {    return Unmanaged<T>.fromOpaque(copaquePointer(ptr)).takeUnretainedValue()    // return unsafeBitCast(ptr,T.self) // ***}

“复杂”的表达方式只适用于Swifts
严格型系统在编译代码中,这只是一个演员
指针之间。 (可以写在***的注释中所示的较短
如果你愿意使用“不安全”的方法,而是编译的
代码是一样的)

使用这个帮助方法,您可以将自己传递给C函数

let voIDPtr = brIDge(self)

(或UnsafeMutablePointer< VoID>(brIDge(self))如果C函数需要
一个可变指针),并将其转换回一个对象指针 – 例如
在一个回调函数 – as

let mySelf : MyType = brIDge(voIDPtr)

不会转让所有权,所以你必须确保自我
只要使用voID指针就存在。

为了完整起见,从Objective-C开始的__brIDge_retained和__brIDge_transfer的Swift将相当于

func brIDgeRetained<T : AnyObject>(obj : T) -> UnsafePointer<VoID> {    return UnsafePointer(Unmanaged.passRetained(obj).toOpaque())}func brIDgeTransfer<T : AnyObject>(ptr : UnsafePointer<VoID>) -> T {    return Unmanaged<T>.fromOpaque(copaquePointer(ptr)).takeRetainedValue()}

brIDgeRetained()将对象指针转换为voID指针
保留对象。 brIDgeTransfer()转换
voID指针返回一个对象指针并消耗保留。

一个优点是该对象不能被释放
电话是因为强烈的参考。缺点是
呼叫必须适当平衡,并且可以轻松导致保留
周期。

Swift 3(Xcode 8)的更新:

func brIDge<T : AnyObject>(obj : T) -> UnsafeRawPointer {    return UnsafeRawPointer(Unmanaged.passUnretained(obj).toOpaque())}func brIDge<T : AnyObject>(ptr : UnsafeRawPointer) -> T {    return Unmanaged<T>.fromOpaque(ptr).takeUnretainedValue()}func brIDgeRetained<T : AnyObject>(obj : T) -> UnsafeRawPointer {    return UnsafeRawPointer(Unmanaged.passRetained(obj).toOpaque())}func brIDgeTransfer<T : AnyObject>(ptr : UnsafeRawPointer) -> T {    return Unmanaged<T>.fromOpaque(ptr).takeRetainedValue()}

对“不安全指针”的相关更改如下所述

> SE-0017 Change Unmanaged to use UnsafePointer
> SE-0107 UnsafeRawPointer API

总结

以上是内存溢出为你收集整理的如何将自己投射到swift中的UnsafeMutablePointer类型全部内容,希望文章能够帮你解决如何将自己投射到swift中的UnsafeMutablePointer类型所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1053558.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存