Osk*_*kar 4 cocoa pointers swift
我有一个以前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)
Run Code Online (Sandbox Code Playgroud)
自从迁移到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)
Run Code Online (Sandbox Code Playgroud)
只是与Bad Access崩溃.什么是正确的使用方法withMemoryRebound?
hostInfo是一个UnsafeMutablePointer<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)
Run Code Online (Sandbox Code Playgroud)
而不是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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2754 次 |
| 最近记录: |