web-dev-qa-db-fra.com

Déterminer la quantité disponible de RAM sur un appareil iOS

Vous avez probablement vu les nombreuses applications "Infos système" qui affichent des choses comme la durée de vie restante de la batterie, et même des informations système comme la mémoire, etc.

De la même manière, existe-t-il un moyen de récupérer la quantité actuelle de RAM de mon application afin que je puisse prendre de meilleures décisions sur le meilleur moment pour vider ou conserver certaines vues pour éviter les avertissements de mémoire ?

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

Veuillez noter que cet appel ne prend pas en compte la mémoire utilisée par le GPU. Si vous voyez une taille plus petite que le ram système attendu. Il s'agit très probablement de mémoire graphique allouée.

128
Nico

Cela fonctionne dans Swift 4.

La différence vraiment importante ici est: il convertit en Int64 avant de se multiplier, car sinon vous obtenez rapidement des débordements, surtout si vous l'exécutez dans un simulateur où il utilise la mémoire du 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)
7
Jan

Vous pouvez vérifier la mémoire RAM disponible sur les appareils 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;  
     }  
5
laxonline