如何在Swift中获取内存使用情况

BB_*_*Dev 10 iphone ios swift

我需要在Swift中以编程方式获取我的应用程序的内存使用量(MB).我找到了Objective-C的示例代码.任何人都可以帮助我将其转换为Swift.谢谢!

void report_memory(void) {
  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);
  if( kerr == KERN_SUCCESS ) {
    NSLog(@"Memory in use (in bytes): %u", info.resident_size);
  } else {
    NSLog(@"Error with task_info(): %s", mach_error_string(kerr));
  }
}
Run Code Online (Sandbox Code Playgroud)

Air*_*ity 8

编辑:oops,应该先检查一下duplicates,Nate已经在这里回答了这个问题.虽然你可能想要注意我使用的版本的细微差别withUnsafeMutablePointer.

由于人们不喜欢"我怎样才能将这个Obj-C代码转换为Swift"问题,所以你得到了贬低,但是在这种情况下它可能是公平的,因为这个特定的转换特别毛茸茸.我认为这是有效的:

func report_memory() {
    var info = task_basic_info()
    var count = mach_msg_type_number_t(sizeofValue(info))/4

    let kerr: kern_return_t = withUnsafeMutablePointer(&info) {

        task_info(mach_task_self_,
            task_flavor_t(TASK_BASIC_INFO),
            task_info_t($0),
            &count)

    }

    if kerr == KERN_SUCCESS {
        println("Memory in use (in bytes): \(info.resident_size)")
    }
    else {
        println("Error with task_info(): " +
            (String.fromCString(mach_error_string(kerr)) ?? "unknown error"))
    }
}
Run Code Online (Sandbox Code Playgroud)

有一些基本的强制 - sizeof返回一个Int,但函数调用需要一个UInt32.同样(并且稍微更令人愤怒),TASK_BASIC_INFO是一个Int32,但呼叫需要一个UInt32.

令人讨厌的部分是传递第三个参数. task_info根据您想要的信息类型,指向不同大小的多种不同结构.因此,您需要从task_basic_info对象获取指针,然后将其转换为task_info实际需要的特定类型的指针(也就是说,一旦您浏览了所有的typedef,指针指向UInt32).

文档task_info说,最后一个count参数应该是"task_info中最大整数数"的计数,但是当它表示整数时,我猜它意味着32位整数因此除以4.


BB_*_*Dev 1

最后我找到了解决方案。请参阅下面的代码片段。

func report_memory() {
    // constant
    let MACH_TASK_BASIC_INFO_COUNT = (sizeof(mach_task_basic_info_data_t) / sizeof(natural_t))

    // prepare parameters
    let name   = mach_task_self_
    let flavor = task_flavor_t(MACH_TASK_BASIC_INFO)
    var size   = mach_msg_type_number_t(MACH_TASK_BASIC_INFO_COUNT)

    // allocate pointer to mach_task_basic_info
    var infoPointer = UnsafeMutablePointer<mach_task_basic_info>.alloc(1)

    // call task_info - note extra UnsafeMutablePointer(...) call
    let kerr = task_info(name, flavor, UnsafeMutablePointer(infoPointer), &size)

    // get mach_task_basic_info struct out of pointer
    let info = infoPointer.move()

    // deallocate pointer
    infoPointer.dealloc(1)

    // check return value for success / failure
    if kerr == KERN_SUCCESS {
        println("Memory in use (in MB): \(info.resident_size/1000000)")
    } else {
        let errorString = String(CString: mach_error_string(kerr), encoding: NSASCIIStringEncoding)
        println(errorString ?? "Error: couldn't parse error string")
    }    
}
Run Code Online (Sandbox Code Playgroud)

  • 复制别人的答案,并不等于“找到解决方案”至少要感谢第一个发布它的人:/sf/answers/1929183931/ (4认同)