webentwicklung-frage-antwort-db.com.de

Ermitteln der verfügbaren Menge von RAM auf einem iOS-Gerät

Sie haben wahrscheinlich die vielen "System Info" -Apps gesehen, die Dinge wie die verbleibende Akkulaufzeit und sogar Systeminformationen wie Speicher usw. anzeigen.

Auf ähnliche Weise gibt es eine Möglichkeit, die aktuelle Menge an verfügbarem RAM von meiner App abzurufen, damit ich bessere Entscheidungen treffen kann, wann es am besten ist, bestimmte Ansichten zu sichern oder beizubehalten, um Speicherwarnungen zu vermeiden ?

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

Bitte beachten Sie, dass dieser Aufruf nicht den Speicher berücksichtigt, der von der GPU verwendet wird. Wenn Sie eine Größe sehen, die kleiner als der erwartete System-RAM ist. Es ist mehr als wahrscheinlich Grafikspeicher zugeordnet.

128
Nico

Dies funktioniert in Swift 4.

Der wirklich wichtige Unterschied hierbei ist: Es wird vor dem Multiplizieren auf Int64 umgewandelt, da es sonst schnell zu Überläufen kommt, insbesondere, wenn Sie es in einem Simulator ausführen, in dem der PC-Speicher verwendet wird.

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

Sie können den verfügbaren RAM Speicher in einem iOS-Gerät überprüfen

    #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