您可能已经看到了许多“系统信息”应用程序,这些应用程序显示诸如剩余电池寿命,甚至是诸如内存等系统信息。
以类似的方式,是否有任何方法可以从我的应用程序中检索当前的可用RAM量,以便我可以更好地决定何时最好转储或保留某些视图以避免内存警告?
您可能已经看到了许多“系统信息”应用程序,这些应用程序显示诸如剩余电池寿命,甚至是诸如内存等系统信息。
以类似的方式,是否有任何方法可以从我的应用程序中检索当前的可用RAM量,以便我可以更好地决定何时最好转储或保留某些视图以避免内存警告?
Answers:
#import <mach/mach.h>
#import <mach/mach_host.h>
void print_free_memory ()
{
mach_port_t host_port;
mach_msg_type_number_t host_size;
vm_size_t pagesize;
host_port = mach_host_self();
host_size = sizeof(vm_statistics_data_t) / sizeof(integer_t);
host_page_size(host_port, &pagesize);
vm_statistics_data_t vm_stat;
if (host_statistics(host_port, HOST_VM_INFO, (host_info_t)&vm_stat, &host_size) != KERN_SUCCESS) {
NSLog(@"Failed to fetch vm statistics");
}
/* Stats in bytes */
natural_t mem_used = (vm_stat.active_count +
vm_stat.inactive_count +
vm_stat.wire_count) * pagesize;
natural_t mem_free = vm_stat.free_count * pagesize;
natural_t mem_total = mem_used + mem_free;
NSLog(@"used: %u free: %u total: %u", mem_used, mem_free, mem_total);
}
请注意,此调用不考虑gpu正在使用的内存。如果看到的大小小于预期的系统内存。它比可能分配的图形内存更多。
[NSProcessInfo processInfo].physicalMemory
将其与之交叉引用,您会发现后者与该设备的市场内存规格更加一致。
这适用于Swift 4。
真正重要的区别是:它在乘法之前强制转换为Int64,因为否则您会很快溢出,特别是如果在使用PC内存的模拟器中运行它。
var pagesize: vm_size_t = 0
let host_port: mach_port_t = mach_host_self()
var host_size: mach_msg_type_number_t = mach_msg_type_number_t(MemoryLayout<vm_statistics_data_t>.stride / MemoryLayout<integer_t>.stride)
host_page_size(host_port, &pagesize)
var vm_stat: vm_statistics = vm_statistics_data_t()
withUnsafeMutablePointer(to: &vm_stat) { (vmStatPointer) -> Void in
vmStatPointer.withMemoryRebound(to: integer_t.self, capacity: Int(host_size)) {
if (host_statistics(host_port, HOST_VM_INFO, $0, &host_size) != KERN_SUCCESS) {
NSLog("Error: Failed to fetch vm statistics")
}
}
}
/* Stats in bytes */
let mem_used: Int64 = Int64(vm_stat.active_count +
vm_stat.inactive_count +
vm_stat.wire_count) * Int64(pagesize)
let mem_free: Int64 = Int64(vm_stat.free_count) * Int64(pagesize)
您可以检查iOS设备中的可用RAM内存
#import mach\mach.h
#import mach\mach_host.h
static natural_t get_free_memory(void)
{
mach_port_t host_port;
mach_msg_type_number_t host_size;
vm_size_t pagesize;
host_port = mach_host_self();
host_size = sizeof(vm_statistics_data_t) / sizeof(integer_t);
host_page_size(host_port, &pagesize);
vm_statistics_data_t vm_stat;
if (host_statistics(host_port, HOST_VM_INFO, (host_info_t)&vm_stat, &host_size) != KERN_SUCCESS)
{
NSLog(@"Failed to fetch vm statistics");
return 0;
}
/* Stats in bytes */
natural_t mem_free = vm_stat.free_count * pagesize;
return mem_free;
}