如何在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") } }
- Xcode 8.1推送通知在swift 2.3与firebase集成没有得到?
- IOS stackview addArrangedSubview添加在特定的索引
- 无法使用types为“(NSMutableURLRequest,(_,_,_)throws – > _”)的参数列表调用“dataTaskWithRequest”
- 如何在Swift中使用NSURLSessionDataTask
- 在Swift中创build一个不规则的UIButton,其中透明的部分是不可选的
- Swift:非零可选值引发一个零例外
- 不知道这是什么意思线程1:EXC_BREAKPOINT(代码= EXC_1386_BPT,子代码= 0x0)
- 从另一个视图控制器访问数组数据
- 如何通过IOS中的AFNetworking在后台上传200多张图片