我试图将ObjC stackoverflow的答案转换为Swift,但失败了。看起来我应该传递inout mach_msg_type_number_t
的时候却传递了UnsafeMutablePointer<mach_msg_type_number_t>
,我似乎无法解决我的问题。从我对Swift指针文档的理解(不多)来看,这些应该是可互换的。?
下面的更多信息。
以下是目标C:
struct task_basic_info info;
mach_msg_type_number_t size = sizeof(info);
kern_return_t kerr = task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t)&info, &size);
字符串
这里是我在Swift中所得到的(许多行用于更容易的类型检查)
let name: task_name_t = mach_task_self_
let flavor: task_flavor_t = task_flavor_t(MACH_TASK_BASIC_INFO)
var info: mach_task_basic_info
var size: mach_msg_type_number_t = UnsignedFixed(sizeof(mach_task_basic_info_t))
let kerr = task_info(name, flavor, info as task_info_t, &size)
型task_info
签名是:
func task_info(target_task: task_name_t, flavor: task_flavor_t, task_info_out: task_info_t, task_info_outCnt: UnsafeMutablePointer<mach_msg_type_number_t>) -> kern_return_t
型
最后一行的错误是:
Cannot convert the expression's type '(@!lvalue task_name_t, task_flavor_t, task_info_t, inout mach_msg_type_number_t)' to type 'kern_return_t'
型
8条答案
按热度按时间7eumitmz1#
我花了一点时间来更新Airspeed Velocity对最新Swift语法(Swift 3,beta 6)的回答,但以下是我得到的:
字符串
希望对你有帮助。
dojqjjoe2#
要在Swift 5中快速复制和粘贴解决方案,请使用
字符串
r7knjye23#
当与C函数交互时,你不能依赖编译器的错误消息--一个参数一个参数地分解它,点击命令直到你知道你在处理什么。首先,你遇到的类型是:
task_name_t
:UInt32
task_flavor_t
:UInt32
task_info_t
:UnsafeMutablePointer<Int32>
UnsafeMutablePointer<mach_msg_type_number_t>
:UnsafeMutablePointer<UInt32>
kern_return_t
-Int32
这里有一个棘手的Swift位沿着,代码中有一个bug。首先,
task_info_out
参数需要是UnsafeMutablePointer<UInt32>
,但实际上需要指向mach_task_basic_info
的示例。我们可以通过创建一个UnsafeMutablePointer<mach_task_basic_info>
并在调用时将其 Package 在 * 另一个 *UnsafeMutablePointer
中来解决这个问题-编译器将使用类型推断来知道我们希望 Package 指针被子类型化为UInt32
。第二,在应该调用
sizeinfo(mach_task_basic_info)
的时候调用了sizeof(mach_task_basic_info_t)
(指向mach_task_basic_info
的指针),所以字节数太少,无法容纳数据结构。在进一步的研究中,这变得有点复杂。最初的代码是不正确的,因为
size
应该被初始化为常量MACH_TASK_BASIC_INFO_COUNT
。不幸的是,这是一个宏,而不是一个简单的常量:字符串
Swift没有导入这些,所以我们需要自己重新定义它。下面是所有这些的工作代码:
型
nr9pn0ug4#
内特的回答很好,但你可以做一个调整来简化它。
首先,不是分配/释放
task_basic_info
指针,而是在堆栈上创建结构体,然后使用withUnsafeMutablePointer
直接获取指向它的指针,然后传入。字符串
ia2d9nvy5#
Swift 5 +合并,连续内存监控
像XCODE一样以MB为单位显示确切的内存
字符串
如何使用
型
ujv3wf0j6#
Airspeed Velocity在Swift 3中的回答
字符串
ohfgkhjo7#
对于Linux:
字符串
mwkjh3gx8#
有一种通用的方法来处理
task_info
,它以方便的方式覆盖了所有与机器无关的任务信息结构:字符串
用途:
型