arrays - Swift 分配指针数组

标签 arrays swift pointers memory

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

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

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

哪个给出了错误

Cannot convert value of type 'UnsafeMutablePointer<T?>' to expected argument type '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] (再次将内存绑定(bind)到 T 后)

最佳答案

很多事情取决于您如何获得 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 的内容, 你需要知道如何 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 ?有了这些信息,我会尝试告诉您在实际情况下需要编写什么样的代码。

关于arrays - Swift 分配指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48004786/

相关文章:

mysql - NSARRAY JSON 空

java - NumberFormatException:无法将 '' 解析为整数

javascript - 使用 Javascript 从非钳位数组高效生成钳位数组

ios - Swift 4 中的可选闭包

c++ - 在线程之间共享类

javascript - 在每个第 n 个位置插入到数组中

ios - 当我们使用VIPER架构时如何创建常量?

swift - 如何使用 ios 图表创建面积图?

c - 将整数解释为指向动态字符串的指针,从指向指针的指针指向的动态 block

delphi - 如果 "dangling pointers"检测不到,如何检测 "Assigned()"?