如何在Swift中获取内存使用

我需要在Swift中以编程方式获取我的应用程序的内存使用量(MB)。 我find了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)); } } 

编辑:oops,应该先检查重复,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")) } } 

有几个基本的强制 – sizeof返回一个Int ,但函数调用需要一个UInt32 。 同样的(而且更TASK_BASIC_INFO ), TASK_BASIC_INFO是一个Int32 ,但是这个调用需要一个UInt32

讨厌的部分正在传递第三个参数。 task_info根据您想要的信息types,将指针指向多种不同大小的结构。 所以你需要从你的task_basic_info对象中得到一个指针,然后把它转换成task_info实际上想要的特定types的指针( task_info ,一旦你遍历所有的typedef,一个指向UInt32的指针)。

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

最后我find了解决办法。 请参阅下面的代码片段。

 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") } }