史上最全的iOS各种设备信息获取总结(iPhone8/iPhone X 已更新)

为了统计用户信息、下发广告,服务器端往往需要手机用户设备及app的各种信息,下面讲述一下各种信息的获取方式:

点击下载以上展示效果的GitHub源码

  • 一行代码就搞定的统一来!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
     // 这个方法后面会列出来
     NSString *deviceName = [self getDeviceName];
     NSLog(@ "设备型号-->%@" , deviceName);
     
     NSString *iPhoneName = [UIDevice currentDevice].name;
     NSLog(@ "iPhone名称-->%@" , iPhoneName); 
     
     NSString *appVerion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@ "CFBundleShortVersionString" ];
     NSLog(@ "app版本号-->%@" , appVerion);
  
     CGFloat batteryLevel = [[UIDevice currentDevice] batteryLevel];
     NSLog(@ "电池电量-->%f" , batteryLevel);
     
     NSString *localizedModel = [UIDevice currentDevice].localizedModel;
     NSLog(@ "localizedModel-->%@" , localizedModel);
     
     NSString *systemName = [UIDevice currentDevice].systemName;
     NSLog(@ "当前系统名称-->%@" , systemName);
     
     NSString *systemVersion = [UIDevice currentDevice].systemVersion;
     NSLog(@ "当前系统版本号-->%@" , systemVersion);
 
     struct utsname systemInfo;
     uname(&systemInfo);
     NSString *device_model = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
     NSLog(@ "device_model-->%@" , device_model);
 
     // 这个方法后面会单独列出
     NSString *macAddress = [self getMacAddress];
     NSLog(@ "macAddress-->%@" , macAddress);
     
     // 这个方法后面会单独列出
     NSString *deviceIP = [self getDeviceIPAddresses];
     NSLog(@ "deviceIP-->%@" , deviceIP);
 
    // 设备上次重启的时间
    NSTimeInterval time = [[NSProcessInfo processInfo] systemUptime];
    NSDate *lastRestartDate = [[NSDate alloc] initWithTimeIntervalSinceNow:( 0  - time)];
  • 广告位标识符:在同一个设备上的所有App都会取到相同的值,是苹果专门给各广告提供商用来追踪用户而设的,用户可以在 设置|隐私|广告追踪里重置此id的值,或限制此id的使用,故此id有可能会取不到值,但好在Apple默认是允许追踪的,而且一般用户都不知道有这么个设置,所以基本上用来监测推广效果,是戳戳有余了

1
2
     NSString *idfa = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
     NSLog(@ "广告位标识符idfa-->%@" , idfa);
  • UUID是Universally Unique Identifier的缩写,中文意思是通用唯一识别码。它是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指 定。这样,每个人都可以建立不与其它人冲突的 UUID。在此情况下,就不需考虑数据库建立时的名称重复问题。苹果公司建议使用UUID为应用生成唯一标识字符串。

1
2
     NSString *uuid = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
     NSLog(@ "唯一识别码uuid-->%@" , uuid);
  • 获取设备型号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
// 获取设备型号然后手动转化为对应名称
- (NSString *)getDeviceName
{
     // 需要#import "sys/utsname.h"
     #warning 题主呕心沥血总结!!最全面!亲测!全网独此一份!!
     struct utsname systemInfo;
     uname(&systemInfo);
     NSString *deviceString = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
     
     if  ([deviceString isEqualToString:@ "iPhone3,1" ])     return  @ "iPhone 4" ;
     if  ([deviceString isEqualToString:@ "iPhone3,2" ])     return  @ "iPhone 4" ;
     if  ([deviceString isEqualToString:@ "iPhone3,3" ])     return  @ "iPhone 4" ;
     if  ([deviceString isEqualToString:@ "iPhone4,1" ])     return  @ "iPhone 4S" ;
     if  ([deviceString isEqualToString:@ "iPhone5,1" ])     return  @ "iPhone 5" ;
     if  ([deviceString isEqualToString:@ "iPhone5,2" ])     return  @ "iPhone 5 (GSM+CDMA)" ;
     if  ([deviceString isEqualToString:@ "iPhone5,3" ])     return  @ "iPhone 5c (GSM)" ;
     if  ([deviceString isEqualToString:@ "iPhone5,4" ])     return  @ "iPhone 5c (GSM+CDMA)" ;
     if  ([deviceString isEqualToString:@ "iPhone6,1" ])     return  @ "iPhone 5s (GSM)" ;
     if  ([deviceString isEqualToString:@ "iPhone6,2" ])     return  @ "iPhone 5s (GSM+CDMA)" ;
     if  ([deviceString isEqualToString:@ "iPhone7,1" ])     return  @ "iPhone 6 Plus" ;
     if  ([deviceString isEqualToString:@ "iPhone7,2" ])     return  @ "iPhone 6" ;
     if  ([deviceString isEqualToString:@ "iPhone8,1" ])     return  @ "iPhone 6s" ;
     if  ([deviceString isEqualToString:@ "iPhone8,2" ])     return  @ "iPhone 6s Plus" ;
     if  ([deviceString isEqualToString:@ "iPhone8,4" ])     return  @ "iPhone SE" ;
     // 日行两款手机型号均为日本独占,可能使用索尼FeliCa支付方案而不是苹果支付
     if  ([deviceString isEqualToString:@ "iPhone9,1" ])     return  @ "国行、日版、港行iPhone 7" ;
     if  ([deviceString isEqualToString:@ "iPhone9,2" ])     return  @ "港行、国行iPhone 7 Plus" ;
     if  ([deviceString isEqualToString:@ "iPhone9,3" ])     return  @ "美版、台版iPhone 7" ;
     if  ([deviceString isEqualToString:@ "iPhone9,4" ])     return  @ "美版、台版iPhone 7 Plus" ;
     if  ([deviceString isEqualToString:@ "iPhone10,1" ])    return  @ "国行(A1863)、日行(A1906)iPhone 8" ;
     if  ([deviceString isEqualToString:@ "iPhone10,4" ])    return  @ "美版(Global/A1905)iPhone 8" ;
     if  ([deviceString isEqualToString:@ "iPhone10,2" ])    return  @ "国行(A1864)、日行(A1898)iPhone 8 Plus" ;
     if  ([deviceString isEqualToString:@ "iPhone10,5" ])    return  @ "美版(Global/A1897)iPhone 8 Plus" ;
     if  ([deviceString isEqualToString:@ "iPhone10,3" ])    return  @ "国行(A1865)、日行(A1902)iPhone X" ;
     if  ([deviceString isEqualToString:@ "iPhone10,6" ])    return  @ "美版(Global/A1901)iPhone X" ;
     
     if  ([deviceString isEqualToString:@ "iPod1,1" ])       return  @ "iPod Touch 1G" ;
     if  ([deviceString isEqualToString:@ "iPod2,1" ])       return  @ "iPod Touch 2G" ;
     if  ([deviceString isEqualToString:@ "iPod3,1" ])       return  @ "iPod Touch 3G" ;
     if  ([deviceString isEqualToString:@ "iPod4,1" ])       return  @ "iPod Touch 4G" ;
     if  ([deviceString isEqualToString:@ "iPod5,1" ])       return  @ "iPod Touch (5 Gen)" ;
     
     if  ([deviceString isEqualToString:@ "iPad1,1" ])       return  @ "iPad" ;
     if  ([deviceString isEqualToString:@ "iPad1,2" ])       return  @ "iPad 3G" ;
     if  ([deviceString isEqualToString:@ "iPad2,1" ])       return  @ "iPad 2 (WiFi)" ;
     if  ([deviceString isEqualToString:@ "iPad2,2" ])       return  @ "iPad 2" ;
     if  ([deviceString isEqualToString:@ "iPad2,3" ])       return  @ "iPad 2 (CDMA)" ;
     if  ([deviceString isEqualToString:@ "iPad2,4" ])       return  @ "iPad 2" ;
     if  ([deviceString isEqualToString:@ "iPad2,5" ])       return  @ "iPad Mini (WiFi)" ;
     if  ([deviceString isEqualToString:@ "iPad2,6" ])       return  @ "iPad Mini" ;
     if  ([deviceString isEqualToString:@ "iPad2,7" ])       return  @ "iPad Mini (GSM+CDMA)" ;
     if  ([deviceString isEqualToString:@ "iPad3,1" ])       return  @ "iPad 3 (WiFi)" ;
     if  ([deviceString isEqualToString:@ "iPad3,2" ])       return  @ "iPad 3 (GSM+CDMA)" ;
     if  ([deviceString isEqualToString:@ "iPad3,3" ])       return  @ "iPad 3" ;
     if  ([deviceString isEqualToString:@ "iPad3,4" ])       return  @ "iPad 4 (WiFi)" ;
     if  ([deviceString isEqualToString:@ "iPad3,5" ])       return  @ "iPad 4" ;
     if  ([deviceString isEqualToString:@ "iPad3,6" ])       return  @ "iPad 4 (GSM+CDMA)" ;
     if  ([deviceString isEqualToString:@ "iPad4,1" ])       return  @ "iPad Air (WiFi)" ;
     if  ([deviceString isEqualToString:@ "iPad4,2" ])       return  @ "iPad Air (Cellular)" ;
     if  ([deviceString isEqualToString:@ "iPad4,4" ])       return  @ "iPad Mini 2 (WiFi)" ;
     if  ([deviceString isEqualToString:@ "iPad4,5" ])       return  @ "iPad Mini 2 (Cellular)" ;
     if  ([deviceString isEqualToString:@ "iPad4,6" ])       return  @ "iPad Mini 2" ;
     if  ([deviceString isEqualToString:@ "iPad4,7" ])       return  @ "iPad Mini 3" ;
     if  ([deviceString isEqualToString:@ "iPad4,8" ])       return  @ "iPad Mini 3" ;
     if  ([deviceString isEqualToString:@ "iPad4,9" ])       return  @ "iPad Mini 3" ;
     if  ([deviceString isEqualToString:@ "iPad5,1" ])       return  @ "iPad Mini 4 (WiFi)" ;
     if  ([deviceString isEqualToString:@ "iPad5,2" ])       return  @ "iPad Mini 4 (LTE)" ;
     if  ([deviceString isEqualToString:@ "iPad5,3" ])       return  @ "iPad Air 2" ;
     if  ([deviceString isEqualToString:@ "iPad5,4" ])       return  @ "iPad Air 2" ;
     if  ([deviceString isEqualToString:@ "iPad6,3" ])       return  @ "iPad Pro 9.7" ;
     if  ([deviceString isEqualToString:@ "iPad6,4" ])       return  @ "iPad Pro 9.7" ;
     if  ([deviceString isEqualToString:@ "iPad6,7" ])       return  @ "iPad Pro 12.9" ;
     if  ([deviceString isEqualToString:@ "iPad6,8" ])       return  @ "iPad Pro 12.9" ;
     if  ([machineString isEqualToString:@ "iPad6,11" ])     return  @ "iPad 5 (WiFi)" ;
     if  ([machineString isEqualToString:@ "iPad6,12" ])     return  @ "iPad 5 (Cellular)" ;
     if  ([machineString isEqualToString:@ "iPad7,1" ])      return  @ "iPad Pro 12.9 inch 2nd gen (WiFi)" ;
     if  ([machineString isEqualToString:@ "iPad7,2" ])      return  @ "iPad Pro 12.9 inch 2nd gen (Cellular)" ;
     if  ([machineString isEqualToString:@ "iPad7,3" ])      return  @ "iPad Pro 10.5 inch (WiFi)" ;
     if  ([machineString isEqualToString:@ "iPad7,4" ])      return  @ "iPad Pro 10.5 inch (Cellular)" ;
     
    if  ([deviceString isEqualToString:@ "AppleTV2,1" ])     return  @ "Apple TV 2" ;
    if  ([deviceString isEqualToString:@ "AppleTV3,1" ])     return  @ "Apple TV 3" ;
    if  ([deviceString isEqualToString:@ "AppleTV3,2" ])     return  @ "Apple TV 3" ;
    if  ([deviceString isEqualToString:@ "AppleTV5,3" ])     return  @ "Apple TV 4" ;
 
     if  ([deviceString isEqualToString:@ "i386" ])          return  @ "Simulator" ;
     if  ([deviceString isEqualToString:@ "x86_64" ])        return  @ "Simulator" ;
     
     return  deviceString;
}
  • mac 地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
- (NSString *)getMacAddress {
     int  mib[ 6 ];
     size_t len;
     char *buf;
     unsigned char *ptr;
     struct if_msghdr *ifm;
     struct sockaddr_dl *sdl;
     
     mib[ 0 ] = CTL_NET;
     mib[ 1 ] = AF_ROUTE;
     mib[ 2 ] =  0 ;
     mib[ 3 ] = AF_LINK;
     mib[ 4 ] = NET_RT_IFLIST;
     
     if  ((mib[ 5 ] = if_nametoindex( "en0" )) ==  0 ) {
         printf( "Error: if_nametoindex error/n" );
         return  NULL;
     }
     
     if  (sysctl(mib,  6 , NULL, &len, NULL,  0 ) <  0 ) {
         printf( "Error: sysctl, take 1/n" );
         return  NULL;
     }
     
     if  ((buf = malloc(len)) == NULL) {
         printf( "Could not allocate memory. error!/n" );
         return  NULL;
     }
     
     if  (sysctl(mib,  6 , buf, &len, NULL,  0 ) <  0 ) {
         printf( "Error: sysctl, take 2" );
         return  NULL;
     }
     
     ifm = (struct if_msghdr *)buf;
     sdl = (struct sockaddr_dl *)(ifm +  1 );
     ptr = (unsigned char *)LLADDR(sdl);
     
     NSString *outstring = [NSString stringWithFormat:@ "xxxxxx" , *ptr, *(ptr+ 1 ), *(ptr+ 2 ), *(ptr+ 3 ), *(ptr+ 4 ), *(ptr+ 5 )];
     free(buf);
     
     return  [outstring uppercaseString];
}
  • IP地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
- (NSString *)getDeviceIPAddresses {
     
     int  sockfd = socket(AF_INET, SOCK_DGRAM,  0 );
     
     NSMutableArray *ips = [NSMutableArray array];
     
     int  BUFFERSIZE =  4096 ;
     
     struct ifconf ifc;
     
     char buffer[BUFFERSIZE], *ptr, lastname[IFNAMSIZ], *cptr;
     
     struct ifreq *ifr, ifrcopy;
     
     ifc.ifc_len = BUFFERSIZE;
     ifc.ifc_buf = buffer;
     
     if  (ioctl(sockfd, SIOCGIFCONF, &ifc) >=  0 ){
         
         for  (ptr = buffer; ptr < buffer + ifc.ifc_len; ){
             
             ifr = (struct ifreq *)ptr;
             int  len = sizeof(struct sockaddr);
             
             if  (ifr->ifr_addr.sa_len > len) {
                 len = ifr->ifr_addr.sa_len;
             }
             
             ptr += sizeof(ifr->ifr_name) + len;
             if  (ifr->ifr_addr.sa_family != AF_INET)  continue ;
             if  ((cptr = (char *)strchr(ifr->ifr_name,  ':' )) != NULL) *cptr =  0 ;
             if  (strncmp(lastname, ifr->ifr_name, IFNAMSIZ) ==  0 continue ;
             
             memcpy(lastname, ifr->ifr_name, IFNAMSIZ);
             ifrcopy = *ifr;
             ioctl(sockfd, SIOCGIFFLAGS, &ifrcopy);
             
             if  ((ifrcopy.ifr_flags & IFF_UP) ==  0 continue ;
             
             NSString *ip = [NSString  stringWithFormat:@ "%s" , inet_ntoa(((struct sockaddr_in *)&ifr->ifr_addr)->sin_addr)];
             [ips addObject:ip];
         }
     }
     
     close(sockfd);
     NSString *deviceIP = @ "" ;
     
     for  ( int  i= 0 ; i < ips.count; i++) {
         if  (ips.count >  0 ) {
             deviceIP = [NSString stringWithFormat:@ "%@" ,ips.lastObject];
         }
     }
     return  deviceIP;
}
  • CPU

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
// CPU总数目
- (NSUInteger)getCPUCount {
     return  [NSProcessInfo processInfo].activeProcessorCount;
}
// 已使用的CPU比例
- (float)getCPUUsage {
     float cpu =  0 ;
     NSArray *cpus = [self getPerCPUUsage];
     if  (cpus.count ==  0 return  - 1 ;
     for  (NSNumber *n  in  cpus) {
         cpu += n.floatValue;
     }
     return  cpu;
}
// 获取每个cpu的使用比例
- (NSArray *)getPerCPUUsage {
     processor_info_array_t _cpuInfo, _prevCPUInfo = nil;
     mach_msg_type_number_t _numCPUInfo, _numPrevCPUInfo =  0 ;
     unsigned _numCPUs;
     NSLock *_cpuUsageLock;
     
     int  _mib[2U] = { CTL_HW, HW_NCPU };
     size_t _sizeOfNumCPUs = sizeof(_numCPUs);
     int  _status = sysctl(_mib, 2U, &_numCPUs, &_sizeOfNumCPUs, NULL, 0U);
     if  (_status)
         _numCPUs =  1 ;
     
     _cpuUsageLock = [[NSLock alloc] init];
     
     natural_t _numCPUsU = 0U;
     kern_return_t err = host_processor_info(mach_host_self(), PROCESSOR_CPU_LOAD_INFO, &_numCPUsU, &_cpuInfo, &_numCPUInfo);
     if  (err == KERN_SUCCESS) {
         [_cpuUsageLock lock];
         
         NSMutableArray *cpus = [NSMutableArray  new ];
         for  (unsigned i = 0U; i < _numCPUs; ++i) {
             Float32 _inUse, _total;
             if  (_prevCPUInfo) {
                 _inUse = (
                           (_cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_USER]   - _prevCPUInfo[(CPU_STATE_MAX * i) + CPU_STATE_USER])
                           + (_cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_SYSTEM] - _prevCPUInfo[(CPU_STATE_MAX * i) + CPU_STATE_SYSTEM])
                           + (_cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_NICE]   - _prevCPUInfo[(CPU_STATE_MAX * i) + CPU_STATE_NICE])
                           );
                 _total = _inUse + (_cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_IDLE] - _prevCPUInfo[(CPU_STATE_MAX * i) + CPU_STATE_IDLE]);
             else  {
                 _inUse = _cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_USER] + _cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_SYSTEM] + _cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_NICE];
                 _total = _inUse + _cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_IDLE];
             }
             [cpus addObject:@(_inUse / _total)];
         }
         
         [_cpuUsageLock unlock];
         if  (_prevCPUInfo) {
             size_t prevCpuInfoSize = sizeof(integer_t) * _numPrevCPUInfo;
             vm_deallocate(mach_task_self(), (vm_address_t)_prevCPUInfo, prevCpuInfoSize);
         }
         return  cpus;
     else  {
         return  nil;
     }
}
  • Disk磁盘空间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// 获取磁盘总空间
- (int64_t)getTotalDiskSpace {
     NSError *error = nil;
     NSDictionary *attrs = [[NSFileManager defaultManager] attributesOfFileSystemForPath:NSHomeDirectory() error:&error];
     if  (error)  return  - 1 ;
     int64_t space =  [[attrs objectForKey:NSFileSystemSize] longLongValue];
     if  (space <  0 ) space = - 1 ;
     return  space;
}
// 获取未使用的磁盘空间
- (int64_t)getFreeDiskSpace {
     NSError *error = nil;
     NSDictionary *attrs = [[NSFileManager defaultManager] attributesOfFileSystemForPath:NSHomeDirectory() error:&error];
     if  (error)  return  - 1 ;
     int64_t space =  [[attrs objectForKey:NSFileSystemFreeSize] longLongValue];
     if  (space <  0 ) space = - 1 ;
     return  space;
}
// 获取已使用的磁盘空间
- (int64_t)getUsedDiskSpace {
     int64_t totalDisk = [self getTotalDiskSpace];
     int64_t freeDisk = [self getFreeDiskSpace];
     if  (totalDisk <  0  || freeDisk <  0 return  - 1 ;
     int64_t usedDisk = totalDisk - freeDisk;
     if  (usedDisk <  0 ) usedDisk = - 1 ;
     return  usedDisk;
}
  • Memory内存相关数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
// 系统总内存空间
- (int64_t)getTotalMemory {
     int64_t totalMemory = [[NSProcessInfo processInfo] physicalMemory];
     if  (totalMemory < - 1 ) totalMemory = - 1 ;
     return  totalMemory;
}
 
// 活跃的内存,正在使用或者很短时间内被使用过
- (int64_t)getActiveMemory {
     mach_port_t host_port = mach_host_self();
     mach_msg_type_number_t host_size = sizeof(vm_statistics_data_t) / sizeof(integer_t);
     vm_size_t page_size;
     vm_statistics_data_t vm_stat;
     kern_return_t kern;
     5
     kern = host_page_size(host_port, &page_size);
     if  (kern != KERN_SUCCESS)  return  - 1 ;
     kern = host_statistics(host_port, HOST_VM_INFO, (host_info_t)&vm_stat, &host_size);
     if  (kern != KERN_SUCCESS)  return  - 1 ;
     return  vm_stat.active_count * page_size;
}
 
// 最近使用过,但是目前处于不活跃状态的内存
- (int64_t)getInActiveMemory {
     mach_port_t host_port = mach_host_self();
     mach_msg_type_number_t host_size = sizeof(vm_statistics_data_t) / sizeof(integer_t);
     vm_size_t page_size;
     vm_statistics_data_t vm_stat;
     kern_return_t kern;
     5
     kern = host_page_size(host_port, &page_size);
     if  (kern != KERN_SUCCESS)  return  - 1 ;
     kern = host_statistics(host_port, HOST_VM_INFO, (host_info_t)&vm_stat, &host_size);
     if  (kern != KERN_SUCCESS)  return  - 1 ;
     return  vm_stat.inactive_count * page_size;
}
 
// 空闲的内存空间
- (int64_t)getFreeMemory {
     mach_port_t host_port = mach_host_self();
     mach_msg_type_number_t host_size = sizeof(vm_statistics_data_t) / sizeof(integer_t);
     vm_size_t page_size;
     vm_statistics_data_t vm_stat;
     kern_return_t kern;
     5
     kern = host_page_size(host_port, &page_size);
     if  (kern != KERN_SUCCESS)  return  - 1 ;
     kern = host_statistics(host_port, HOST_VM_INFO, (host_info_t)&vm_stat, &host_size);
     if  (kern != KERN_SUCCESS)  return  - 1 ;
     return  vm_stat.free_count * page_size;
}
 
// 已使用的内存空间
- (int64_t)getUsedMemory {
     mach_port_t host_port = mach_host_self();
     mach_msg_type_number_t host_size = sizeof(vm_statistics_data_t) / sizeof(integer_t);
     vm_size_t page_size;
     vm_statistics_data_t vm_stat;
     kern_return_t kern;
     5
     kern = host_page_size(host_port, &page_size);
     if  (kern != KERN_SUCCESS)  return  - 1 ;
     kern = host_statistics(host_port, HOST_VM_INFO, (host_info_t)&vm_stat, &host_size);
     if  (kern != KERN_SUCCESS)  return  - 1 ;
     return  page_size * (vm_stat.active_count + vm_stat.inactive_count + vm_stat.wire_count);
}
 
// 用来存放内核和数据结构的内存,framework、用户级别的应用无法分配
- (int64_t)getWiredMemory {
     mach_port_t host_port = mach_host_self();
     mach_msg_type_number_t host_size = sizeof(vm_statistics_data_t) / sizeof(integer_t);
     vm_size_t page_size;
     vm_statistics_data_t vm_stat;
     kern_return_t kern;
     5
     kern = host_page_size(host_port, &page_size);
     if  (kern != KERN_SUCCESS)  return  - 1 ;
     kern = host_statistics(host_port, HOST_VM_INFO, (host_info_t)&vm_stat, &host_size);
     if  (kern != KERN_SUCCESS)  return  - 1 ;
     return  vm_stat.wire_count * page_size;
}
 
// 可释放的内存空间:内存吃紧自动释放,针对大对象存放所需的大块内存空间
- (int64_t)getPurgableMemory {
     mach_port_t host_port = mach_host_self();
     mach_msg_type_number_t host_size = sizeof(vm_statistics_data_t) / sizeof(integer_t);
     vm_size_t page_size;
     vm_statistics_data_t vm_stat;
     kern_return_t kern;
     5
     kern = host_page_size(host_port, &page_size);
     if  (kern != KERN_SUCCESS)  return  - 1 ;
     kern = host_statistics(host_port, HOST_VM_INFO, (host_info_t)&vm_stat, &host_size);
     if  (kern != KERN_SUCCESS)  return  - 1 ;
     return  vm_stat.purgeable_count * page_size;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值