Swift分配指针数组

时间:2017-12-28 09:20:51

标签: arrays swift pointers memory

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

e.g。尝试为类型T分配n块内存,以获取CFSet cfsetref

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

哪个给出了错误

  

无法转换类型&#39; UnsafeMutablePointer<T?>&#39;的值预期   参数类型&#39; UnsafeMutablePointer<UnsafeRawPointer?>!&#39;

我尝试将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错误

1 个答案:

答案 0 :(得分: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)
}

如何获得cfsetref以及实际是T的内容?有了这些信息,我会试着告诉你在实际案例中需要编写什么样的代码。