【问题标题】:Swift Allocate Array of PointersSwift分配指针数组
【发布时间】:2017-12-28 09:20:51
【问题描述】:

如何将UnsafeMutablePointer<T?> 用作UnsafeMutablePointer<UnsafeRawPointer?>!

例如尝试为类型 T 分配 n 块内存,以从 CFSet cfsetref 中获取值:

var array = UnsafeMutableRawPointer<T?>.allocate(capacity: n)
CFSetGetValues(cfsetref, array) // error

这给出了错误

无法将“UnsafeMutablePointer&lt;T?&gt;”类型的值转换为预期值 参数类型'UnsafeMutablePointer&lt;UnsafeRawPointer?&gt;!'

我尝试将array 声明为UnsafeMutablePointer&lt;UnsafeRawPointer?&gt; 然后这样做

for i in 0..<n {
  var d = array[i]
  d?.bindMemory(to: T.self, capacity: 1)
}

但我在尝试访问array[i] 时仍然收到EXC_BAD_INSTRUCTION 错误(在将内存再次绑定到T 之后)

【问题讨论】:

    标签: arrays swift pointers memory


    【解决方案1】:

    很多事情取决于您如何获得cfsetref 以及实际上是什么T

    但无论如何,CFSetGetValues 需要 UnsafeMutablePointer&lt;UnsafeRawPointer?&gt;!,如错误消息中所示。

    let n = CFSetGetCount(cfsetref)
    let array = UnsafeMutablePointer<UnsafeRawPointer?>.allocate(capacity: n)
    array.initialize(to: nil, count: n)
    CFSetGetValues(cfsetref, array)
    

    要安全访问array 的内容,您需要了解T 是如何由Swift ARC 管理的。例如,假设 TNSNumber,你需要告诉 Swift ARC 来管理结果,这样写:

    let managedArray = UnsafeMutableBufferPointer(start: array, count: n).map{Unmanaged<NSNumber>.fromOpaque($0!).takeRetainedValue()}
    print(managedArray)
    

    但与其他 CF 集合类型一样,处理 CFSet 的更好方法是将其桥接到 Swift Set

    if let swiftSet = cfsetref as? Set<NSNumber> {
        let swiftArray = Array(swiftSet)
        print(swiftArray)
    }
    

    您如何获得您的cfsetref 以及T 实际上是什么?有了这些信息,我会试着告诉你在你的实际情况下你需要写什么样的代码。

    【讨论】:

    • 连接到Set 感觉不错。我的CFSet 来自IOHIDManagerCopyDevices,其中TIOHIDDevice。我试图管理自己的指针/内存无处可去,但桥接到Set 似乎开箱即用(而且简单得多)。非常感谢。
    猜你喜欢
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多