确定iOS设备上可用的RAM数量

你可能已经看到了许多“系统信息”应用程序,其中显示的东西,如电池剩余时间,甚至像内存等系统信息。

以类似的方式,有没有办法从我的应用程序检索当前可用的RAM的数量,以便我可以做出更好的决定,何时最好转储或保留某些视图以避免内存警告?

#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正在使用的内存。 如果您看到的尺寸比预期的系统内存更小。 这是更可能分配的graphics内存。

您可以在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; } 

这在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)