我需要在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)
编辑: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.
最后我找到了解决方案。请参阅下面的代码片段。
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)
| 归档时间: |
|
| 查看次数: |
12699 次 |
| 最近记录: |