Determinar la cantidad de RAM disponible en un dispositivo iOS

Es probable que hayas visto las muchas aplicaciones de “Información del sistema” que muestran cosas como la duración restante de la batería e, incluso, información del sistema como memoria, etc.

De manera similar, ¿hay alguna forma de recuperar la cantidad actual de RAM disponible de mi aplicación para que pueda tomar mejores decisiones sobre cuándo es mejor descargar o mantener ciertas vistas para evitar advertencias de memoria?

#import  #import  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); } 

Tenga en cuenta que esta llamada no tiene en cuenta la memoria que está utilizando la GPU. Si está viendo un tamaño que es más pequeño que el esperado del sistema ram. Es más que probable que haya asignado memoria de gráficos.

Puede verificar la memoria RAM disponible en un dispositivo iOS

  #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; } 

Esto funciona en Swift 4.

La diferencia realmente importante aquí es: se envía a Int64 antes de multiplicarse, porque de lo contrario se produce un desbordamiento rápido, especialmente si lo ejecuta en un simulador donde utiliza la memoria de la 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.stride / MemoryLayout.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)