加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Swift 2 – UnsafeMutablePointer到对象

发布时间:2020-12-14 05:54:19 所属栏目:百科 来源:网络整理
导读:如果我有一个方法如: func someMethod(contextPtr: UnsafeMutablePointerVoid) 如何从contextPtr获取对象? func someMethod(contextPtr: UnsafeMutablePointerVoid){ let object:MyObject = contextPtr.memory} 得到: ‘Void’ is not convertible to ‘M
如果我有一个方法如:
func someMethod(contextPtr: UnsafeMutablePointer<Void>)

如何从contextPtr获取对象?

func someMethod(contextPtr: UnsafeMutablePointer<Void>){    
    let object:MyObject = contextPtr.memory
}

得到:

‘Void’ is not convertible to ‘MyObject’

什么是秘密酱

更多详情:

我在这里实际做的是为SCNetworkReachability设置全局回调函数:

func callback(reachability:SCNetworkReachability,flags: SCNetworkReachabilityFlags,info: UnsafeMutablePointer<Void>) {

    let r:Reachability = info.memory
}

然后添加回调如下:

var context = SCNetworkReachabilityContext(version: 0,info: nil,retain: nil,release: nil,copyDescription: nil)
var s = self
withUnsafeMutablePointer(&s) {
    context.info = UnsafeMutablePointer($0)
}
SCNetworkReachabilitySetCallback(reachability,callback,&context)
这应该工作:将对象指针传递为不透明的非托管指针
回调:
context.info = UnsafeMutablePointer(Unmanaged.passUnretained(myObject).toOpaque())
SCNetworkReachabilitySetCallback(reachability,&context)

并通过以下方式在回调中检索:

func callback(reachability:SCNetworkReachability,info: UnsafeMutablePointer<Void>) {

    let myObject = Unmanaged<MyObject>.fromOpaque(COpaquePointer(info)).takeUnretainedValue()

}

当然,这假设有一些对该对象的强烈引用存在
只要回调被安装,使对象不是
释放。

更新:请注意,从对象指针到void指针的转换
如果您愿意使用“不安全”功能,则可以简化后退:

context.info = unsafeAddressOf(myObject)
// ...
myObject = unsafeBitCast(info,MyObject.self)

生成的汇编代码 – 就我所见 – 相同。

更新2:另请参阅How to cast self to UnsafeMutablePointer<Void> type in swift了解更多信息
关于“桥接”和一些可以在这里使用的帮助函数。

Swift 3更新(Xcode 8 beta 6):

var context = SCNetworkReachabilityContext(version: 0,copyDescription: nil)
context.info = UnsafeMutableRawPointer(Unmanaged.passUnretained(self).toOpaque())

// ...

func callback(reachability:SCNetworkReachability,info: UnsafeMutableRawPointer?) {
    if let info = info {
        let myObject = Unmanaged<MyObject>.fromOpaque(info).takeUnretainedValue()
        // ...
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读