MACH_TASK_BASIC_INFO 的 Swift 指针问题

标签 swift mach

我正在尝试将 ObjC stackoverflow 答案转换为 Swift 但失败了。看起来我正在通过 UnsafeMutablePointer<mach_msg_type_number_t>当我应该通过 inout mach_msg_type_number_t我似乎无法解决我的问题。根据我对 Swift 指针文档(不多)的理解,这些应该可以互换......?

下面有更多信息。

这是 objective-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'

最佳答案

我花了一些时间来更新 Airspeed Velocity 对最新 swift 语法(Swift 3,beta 6)的回答,但这是我得到的:

func report_memory() {
    var info = mach_task_basic_info()
    let MACH_TASK_BASIC_INFO_COUNT = MemoryLayout<mach_task_basic_info>.stride/MemoryLayout<natural_t>.stride
    var count = mach_msg_type_number_t(MACH_TASK_BASIC_INFO_COUNT)

    let kerr: kern_return_t = withUnsafeMutablePointer(to: &info) {
        $0.withMemoryRebound(to: integer_t.self, capacity: MACH_TASK_BASIC_INFO_COUNT) {
            task_info(mach_task_self_,
                      task_flavor_t(MACH_TASK_BASIC_INFO),
                      $0,
                      &count)
        }
    }

    if kerr == KERN_SUCCESS {
        print("Memory in use (in bytes): \(info.resident_size)")
    }
    else {
        print("Error with task_info(): " +
            (String(cString: mach_error_string(kerr), encoding: String.Encoding.ascii) ?? "unknown error"))
    }
}

希望对您有所帮助。

关于MACH_TASK_BASIC_INFO 的 Swift 指针问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27556807/

相关文章:

Go 语言/CGO : Problems calling Mach API host_statistics() from Go

ios - 在 Swift 中将静态方法设置为 UITapGestureRecognizer 的 Action

iOS 9 - Xcode : "Follows Readable Width" programmatically

iOS( swift ): How to resize the height of an UIWebView when keyboard is/not in use

swift - 如何保存用户位置并使用图钉(或其他标记)将其显示在 map 上?

macos - 从 kext 订阅新进程创建并获取该进程的 pid

ios - UILabel 在动态创建的 UIView 上不可见

macos - Delphi - 在 OSX 上获取完整的堆栈跟踪

c - 如何在 macOS 上使用 Mach 内核设置主机异常端口?