来自swift的C数组内存释放

Pip*_*ppo 3 macos interop ios swift xcode6

var cpuInfo: processor_info_array_t = nil
var numCpuInfo: mach_msg_type_number_t = 0
var coresTotalUsage: Float = 0.0
var numCPUsU: natural_t = 0
let err = host_processor_info(mach_host_self(), PROCESSOR_CPU_LOAD_INFO, &numCPUsU, &cpuInfo, &numCpuInfo);
assert(err == KERN_SUCCESS, "Failed call to host_processor_info")
Run Code Online (Sandbox Code Playgroud)

嗨,我正在调用上面的C API host_processor_info从swift获取进程加载信息,没问题. cpuInfo是一个inout参数(指针),返回时将指向包含该API分配的CPU信息的结构.调用者负责释放内存; 我可以很容易地从目标C那里做到这一点但是没有任何好运.我知道我可以将该调用包装成一个客观的C扩展,但我正在尝试学习swift,并且如果可能的话,希望避免使用obj-c解决方案.

在obj-c我会解除:

size_t cpuInfoSize = sizeof(integer_t) * numCpuInfo;
vm_deallocate(mach_task_self(), (vm_address_t) cpuInfo, cpuInfoSize)
Run Code Online (Sandbox Code Playgroud)

swift中的cpuInfo是一个不能转换为vm_address_t的UnsafeMutablePointer.

任何帮助表示感谢,谢谢.

Mar*_*n R 5

processor_info_array_t是指针类型,vm_address_t是整数类型(最终是别名UInt).(从这个评论来看<i386/vm_types.h> 可能是出于历史原因.)在Swift中将指针转换为整数(相同大小)的唯一方法是unsafeBitCast.

mach_init.h 定义

extern mach_port_t      mach_task_self_;
#define mach_task_self() mach_task_self_
Run Code Online (Sandbox Code Playgroud)

只有外部变量在Swift中可见,而不是宏.

这给出了:

let cpuInfoSize = vm_size_t(sizeof(integer_t)) * vm_size_t(numCpuInfo)
vm_deallocate(mach_task_self_, unsafeBitCast(cpuInfo, vm_address_t.self), cpuInfoSize)
Run Code Online (Sandbox Code Playgroud)