This question already has answers here:
Swift pointer problems with MACH_TASK_BASIC_INFO
(6个答案)
4年前关闭。
我需要在Swift中以编程方式获取应用程序的内存使用量(MB)。我找到了Objective-C的示例代码。任何人都可以帮助我将其转换为Swift。谢谢!
基本强制有几个–
讨厌的部分传入了第三个参数。
(6个答案)
4年前关闭。
我需要在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));
}
}
最佳答案
编辑:哎呀,应该先检查重复项,内特已经回答了这个问题here。尽管您可能要注意我的版本中使用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
是Int32
,但是调用需要一个UInt32
。讨厌的部分传入了第三个参数。
task_info
根据不同类型的信息获取一个指向不同大小的多种不同结构的指针。因此,您需要从task_basic_info
对象中获取一个指针,然后将其转换为task_info
实际想要的特定类型的指针(即,当您遍历所有typedef后,将指向UInt32
的指针)。task_info
的文档说,最后一个count
参数应该是“task_info中的最大整数数”的计数,但是当它说整数时,我想这意味着32位整数,因此除以4。关于ios - 如何在Swift中获得内存使用情况,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29794281/