web-dev-qa-db-ja.com

iOSデバイスで利用可能なRAMの量の決定

おそらく、バッテリー残量のようなものや、メモリなどのシステム情報を表示する多くの「システム情報」アプリを見たことがあるでしょう。

同様に、現在の利用可能な量RAMをアプリから取得する方法はあります。これにより、メモリ警告を回避するために特定のビューをダンプまたは保持するのに最適なタイミングを決定できます。 ?

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

この呼び出しは、GPUによって使用されているメモリを考慮していないことに注意してください。予想されるシステムRAMより小さいサイズが表示されている場合。これは、おそらくグラフィックメモリを割り当てられています。

128
Nico

これはSwift 4。

ここで本当に重要な違いは、乗算する前にInt64にキャストすることです。そうしないと、特に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

利用可能なRAM 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