Swift分配指针数组

问题描述 投票:0回答:1

我如何使用UnsafeMutablePointer<T?>作为UnsafeMutablePointer<UnsafeRawPointer?>!

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

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

这给出了错误

无法将'UnsafeMutablePointer<T?>'类型的值转换为预期参数类型'UnsafeMutablePointer<UnsafeRawPointer?>!'

我尝试将array宣布为UnsafeMutablePointer<UnsafeRawPointer?>然后做

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

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

arrays swift pointers memory
1个回答
3
投票

许多事情取决于你如何得到你的cfsetref和实际上是T

但无论如何,CFSetGetValues期望UnsafeMutablePointer<UnsafeRawPointer?>!如错误消息中所示。

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

要安全地访问array的内容,您需要知道如何通过Swift ARC管理T。例如,假设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)
}

你怎么得到你的cfsetrefT究竟是什么?有了这些信息,我会试着告诉你在实际案例中需要编写什么样的代码。

© www.soinside.com 2019 - 2024. All rights reserved.