Определение доступного объема ОЗУ на устройстве iOS
Вероятно, вы видели множество приложений "System Info", которые отображают такие вещи, как оставшееся время автономной работы и даже системная информация, такая как память и т.д.
Аналогичным образом, есть ли способ извлечь текущий объем доступной ОЗУ из моего приложения, чтобы я мог принимать более правильные решения, когда лучше всего сбросить или сохранить определенные представления, чтобы избежать предупреждений памяти?
Ответы
Ответ 1
#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. Если вы видите размер, размер которого меньше ожидаемого. Это более чем вероятно выделенная графическая память.
Ответ 2
Вы можете проверить доступную 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;
}
Ответ 3
Это работает в 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, $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)