Определение доступного объема оперативной памяти на устройстве iOS



вы, вероятно, видели много приложений "System Info", которые отображают такие вещи, как оставшееся время автономной работы и даже системную информацию, такую как память и т. д.



аналогичным образом, есть ли способ получить текущий объем доступной оперативной памяти из моего приложения, чтобы я мог принимать лучшие решения о том, когда лучше всего сбрасывать или сохранять определенные представления, чтобы избежать предупреждений о памяти?

523   3  

3 ответов:

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

обратите внимание, что этот вызов не учитывает память, которая используется ГПУ. Если вы видите размер, который меньше, чем ожидалось ОЗУ системы. Это более чем вероятно выделенная графическая память.

вы можете проверить доступную оперативную память в устройствах 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;  
     }  

это работает в Swift 4.

действительно важное отличие здесь: он бросает Int64 перед умножением, потому что в противном случае вы быстро переполняетесь, особенно если вы запускаете его в симуляторе, где он использует память ПК.

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, , &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)

Comments

    Ничего не найдено.