确定 iOS 设备上的可用 RAM 量
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/5012886/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Determining the available amount of RAM on an iOS device
提问by m0rtimer
You've likely seen the many "System Info" apps out there which display things like remaining battery life, and even system info like memory, etc.
您可能已经看到许多“系统信息”应用程序,它们显示剩余电池寿命,甚至内存等系统信息。
In a similar manner, is there any way to retrieve the current amount of available RAM from my app so that I can make better decisions on when it's best to dump or keep certain views to avoid memory warnings?
以类似的方式,是否有任何方法可以从我的应用程序中检索当前可用 RAM 量,以便我可以更好地决定何时最好转储或保留某些视图以避免内存警告?
回答by Nico
#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);
}
Please note that this call does not account for memory that is being used by the gpu. If you are seeing a size that is smaller than expected system ram. It is more than likely allocated graphics memory.
请注意,此调用不考虑 GPU 正在使用的内存。如果您看到的大小小于预期的系统内存。它很可能分配了图形内存。
回答by Jan
This works in Swift 4.
这适用于 Swift 4。
The really important difference here is: It casts to Int64 before multiplying, because otherwise you get quickly overflows, especially if you run it in a simulator where it uses the PC Memory.
这里真正重要的区别是:它在乘法之前转换为 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, #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;
}
, &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)
回答by laxonline
You can check the available RAM Memory in an iOS devices
您可以检查 iOS 设备中的可用 RAM 内存
##代码##