2010-05-09 18 views
23

¿Existe una función o constante que defina la cantidad de memoria disponible para una aplicación en iPhone OS?Memoria disponible para la aplicación iPhone OS

Estoy buscando una forma independiente del dispositivo (iPod touch, iPhone, iPad) para saber cuánta memoria le queda.

Respuesta

49

Esta función devolverá la memoria disponible en bytes:

#import <mach/mach.h> 
#import <mach/mach_host.h> 

natural_t freeMemory(void) { 
    mach_port_t   host_port = mach_host_self(); 
    mach_msg_type_number_t host_size = sizeof(vm_statistics_data_t)/sizeof(integer_t); 
    vm_size_t    pagesize; 
    vm_statistics_data_t  vm_stat; 

    host_page_size(host_port, &pagesize); 

    if (host_statistics(host_port, HOST_VM_INFO, (host_info_t)&vm_stat, &host_size) != KERN_SUCCESS) NSLog(@"Failed to fetch vm statistics"); 

    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; 

    return mem_free; 
} 
+0

Gracias Ben. Solo para confirmar, ¿su solución usa alguna API privada? ¿Qué bibliotecas debo importar para usarlo? – hpique

+0

No, no hay API privadas. –

+0

Esto es bueno @BenGottlieb, ¿Cómo alguien tiene esta mente? El código que has hecho aquí, nunca podría pensar en hacerlo. ¡Estupendo! – Hemang

3

No existe una cantidad máxima definida de memoria que una aplicación de iPhone puede usar. Que su aplicación finalice debido a la falta de memoria depende de los algoritmos que esté usando el sistema operativo y de otras aplicaciones que estén utilizando la memoria al mismo tiempo (safari, correo, etc.).

+0

El sistema operativo matará los hilos de safari, correo, etc. según sea necesario si se está quedando sin memoria. Puede ver esto en los registros de la consola a medida que baja la memoria. – progrmr

+0

¿Esto significa que la respuesta de Ben Gottlieb es incorrecta? – hpique

+0

@hgpc, su forma de encontrar cómo encontrar * memoria del sistema disponible, ya que el sistema liberará más para usted si sigue asignando, no es un número definido y si asigna demasiado, su proceso será eliminado. Ninguna aplicación de iPhone debería usar más de 30 MB de memoria a mi entender. – overboming

3

la siguiente rápido función devolverá los sistemas de memoria libre (RAM) en bytes. regresará nulo en caso de falla.

func systemFreeMemorySize() -> UInt? 
{ 
    let HOST_VM_INFO_COUNT: mach_msg_type_number_t = mach_msg_type_number_t(sizeof(vm_statistics_data_t)/sizeof(integer_t)) 

    let host: host_t = mach_host_self() 

    var pageSize: vm_size_t = vm_size_t() 
    let hostPageSizeKernStatus: kern_return_t = host_page_size(host, &pageSize) 
    guard hostPageSizeKernStatus == KERN_SUCCESS else { 
     NSLog("Error with host_page_size(): " + (String.fromCString(mach_error_string(hostPageSizeKernStatus)) ?? "unknown error")) 
     return nil 
    } 

    var stats: vm_statistics_data_t = vm_statistics_data_t() 
    var count: mach_msg_type_number_t = HOST_VM_INFO_COUNT 

    let kernStatus: kern_return_t = withUnsafeMutablePointer(&stats) { 
     return host_statistics(host, HOST_VM_INFO, host_info_t($0), &count) 
    } 

    guard kernStatus == KERN_SUCCESS else { 
     NSLog("Error with host_statistics(): " + (String.fromCString(mach_error_string(kernStatus)) ?? "unknown error")) 
     return nil 
    } 

    return UInt(stats.free_count) * UInt(pageSize) 
} 
Cuestiones relacionadas