码迷,mamicode.com
首页 > 移动开发 > 详细

IOS代码获取内存大小

时间:2015-06-18 13:38:53      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:

#include <mach/mach.h>

//存储内存

- (float)getFreeDiskspace{

    float totalSpace;

    float totalFreeSpace=0.f;

    NSError *error = nil;

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    NSDictionary *dictionary = [[NSFileManager defaultManager] attributesOfFileSystemForPath:[paths lastObject] error: &error];

    if (dictionary) {

        NSNumber *fileSystemSizeInBytes = [dictionary objectForKey: NSFileSystemSize];

        NSNumber *freeFileSystemSizeInBytes = [dictionary objectForKey:NSFileSystemFreeSize];

        totalSpace = [fileSystemSizeInBytes floatValue]/1024.0f/1024.0f/1024.0f;

        totalFreeSpace = [freeFileSystemSizeInBytes floatValue]/1024.0f/1024.0f/1024.0f;

        NSLog(@"Memory Capacity of %f GB with %f GB Free memory available.", totalSpace, totalFreeSpace);

    } else {

        NSLog(@"Error Obtaining System Memory Info: Domain = %@, Code = %@", [error domain], [error code]);

    }

    return totalFreeSpace;

}

//可用运行内存

- (double)getAvailableBytes

{

    vm_statistics_data_t vmStats;

    mach_msg_type_number_t infoCount = HOST_VM_INFO_COUNT;

    kern_return_t kernReturn = host_statistics(mach_host_self(), HOST_VM_INFO, (host_info_t)&vmStats, &infoCount);

    

    if (kernReturn != KERN_SUCCESS)

    {

        return NSNotFound;

    }

    

    return (vm_page_size * vmStats.free_count) + (vmStats.inactive_count * vm_page_size);

}


- (double)getAvailableKiloBytes

{

    return [self getAvailableBytes] / 1024.0;

}


- (double)getAvailableMegaBytes

{

    return [self getAvailableKiloBytes] / 1024.0;

}

//-----------------------------------------------------

内存各种类型

原文网址http://www.cnblogs.com/bandy/archive/2012/08/15/2639742.html

BOOL memoryInfo(vm_statistics_data_t *vmStats) {
    mach_msg_type_number_t infoCount = HOST_VM_INFO_COUNT;
    kern_return_t kernReturn = host_statistics(mach_host_self(), HOST_VM_INFO, (host_info_t)vmStats, &infoCount);
    
    return kernReturn == KERN_SUCCESS;
}

void logMemoryInfo() {
    vm_statistics_data_t vmStats;
    
    if (memoryInfo(&vmStats)) {
        NSLog(@"free: %u\nactive: %u\ninactive: %u\nwire: %u\nzero fill: %u\nreactivations: %u\npageins: %u\npageouts: %u\nfaults: %u\ncow_faults: %u\nlookups: %u\nhits: %u",
            vmStats.free_count * vm_page_size,
            vmStats.active_count * vm_page_size,
            vmStats.inactive_count * vm_page_size,
            vmStats.wire_count * vm_page_size,
            vmStats.zero_fill_count * vm_page_size,
            vmStats.reactivations * vm_page_size,
            vmStats.pageins * vm_page_size,
            vmStats.pageouts * vm_page_size,
            vmStats.faults,
            vmStats.cow_faults,
            vmStats.lookups,
            vmStats.hits
        );
    }
}
技术分享

 

调用memoryInfo()就能拿到内存信息了,它的类型是vm_statistics_data_t。这个结构体有很多字段,在logMemoryInfo()中展示了如何获取它们。注意这些字段大都是页面数,要乘以vm_page_size才能拿到字节数。
顺便再简要介绍下:free是空闲内存;active是已使用,但可被分页的(在iOS中,只有在磁盘上静态存在的才能被分页,例如文件的内存映射,而动态分配的内存是不能被分页的);inactive是不活跃的,也就是程序退出后却没释放的内存,以便加快再次启动,而当内存不足时,就会被回收,因此也可看作空闲内存;wire就是已使用,且不可被分页的。

最后你会发现,即使把这些全加起来,也比设备内存少很多,那么剩下的只好当成已被占用的神秘内存了。不过在模拟器上,这4个加起来基本上就是Mac的物理内存量了,相差不到2MB。
而总物理内存可以用NSRealMemoryAvailable()来获取,这个函数不需要提供参数,文档里也有记载,我就不写演示代码了。

IOS代码获取内存大小

标签:

原文地址:http://blog.csdn.net/u014202635/article/details/46546121

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!