gpt4 book ai didi

swift - 在 Swift 3 中使用 withMemoryRebound 的问题

转载 作者:搜寻专家 更新时间:2023-10-31 08:25:30 25 4
gpt4 key购买 nike

我有一个以前使用 UnsafeMutablePointer 调用 C 函数的应用程序,如下所示:

    var size     = HOST_BASIC_INFO_COUNT
let hostInfo = host_basic_info_t.allocate(capacity: 1)
let result = host_info(machHost, HOST_BASIC_INFO,
UnsafeMutablePointer(hostInfo), &size)

自从迁移到 Swift 3、Xcode Beta 6 后,系统会提示您使用 withMemoryRebound。问题是我不明白在这种情况下如何使用它,而且还没有它的文档或示例代码。我的做法:

    var size     = HOST_BASIC_INFO_COUNT
let hostInfo = host_basic_info_t.allocate(capacity: 1)
let temp = hostInfo.withMemoryRebound(to: host_info_t!.self, capacity: Int(size)) {
UnsafeBufferPointer(start: $0, count: Int(size))
}
let result = host_statistics(machHost,
HOST_BASIC_INFO,
temp.baseAddress?.pointee,
&size)

简单地因 Bad Access 而崩溃。 withMemoryRebound 的正确使用方法是什么?

最佳答案

hostInfoUnsafeMutablePointer<host_basic_info> ,那个指针必须“反弹”到指向 HOST_BASIC_INFO_COUNT 的指针项目的 integer_t ,正如 hostInfo() 所预期的那样功能:

let HOST_BASIC_INFO_COUNT = MemoryLayout<host_basic_info>.stride/MemoryLayout<integer_t>.stride
var size = mach_msg_type_number_t(HOST_BASIC_INFO_COUNT)
let hostInfo = host_basic_info_t.allocate(capacity: 1)
let result = hostInfo.withMemoryRebound(to: integer_t.self, capacity: HOST_BASIC_INFO_COUNT) {
host_info(mach_host_self(), HOST_BASIC_INFO, $0, &size)
}

print(result, hostInfo.pointee)
hostInfo.deallocate(capacity: 1)

而不是 allocate/deallocate你也可以使用本地变量并传递其地址:

let HOST_BASIC_INFO_COUNT = MemoryLayout<host_basic_info>.stride/MemoryLayout<integer_t>.stride
var size = mach_msg_type_number_t(HOST_BASIC_INFO_COUNT)
var hostInfo = host_basic_info()

let result = withUnsafeMutablePointer(to: &hostInfo) {
$0.withMemoryRebound(to: integer_t.self, capacity: Int(size)) {
host_info(mach_host_self(), Int32(HOST_BASIC_INFO), $0, &size)
}
}
print(result, hostInfo)

关于swift - 在 Swift 3 中使用 withMemoryRebound 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38994818/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com