Determine if iOS device is 32- or 64-bit

匿名 (未验证) 提交于 2019-12-03 02:44:02

问题:

Does anyone know of an easy way to tell if an iOS7 device has 32- or 64-bit hardware? I don't mean programmatically, I just mean via settings, model number, 3rd-party app, etc.

I'm having a problem that I suspect is 64-bit related. Apple's advice is to test on the 64-bit simulator but also on an actual 64-bit device, but then doesn't say anything about how to determine that. I can write a test app to check sizeof(int) or whatever, but there's got to be some way for, say, tech support to know what they're working with.

Eric

回答1:

There is no other "official" way to determine it. You can determine it using this code:

if (sizeof(void*) == 4) {     NSLog(@"32-bit App"); } else if (sizeof(void*) == 8) {     NSLog(@"64-bit App"); } 


回答2:

Below is the method is64bitHardware. It returns YES if the hardware is a 64-bit hardware and works on a real iOS device and in an iOS Simulator. Here is source.

#include   + (BOOL) is64bitHardware { #if __LP64__     // The app has been compiled for 64-bit intel and runs as 64-bit intel     return YES; #endif      // Use some static variables to avoid performing the tasks several times.     static BOOL sHardwareChecked = NO;     static BOOL sIs64bitHardware = NO;      if(!sHardwareChecked)     {         sHardwareChecked = YES;  #if TARGET_IPHONE_SIMULATOR         // The app was compiled as 32-bit for the iOS Simulator.         // We check if the Simulator is a 32-bit or 64-bit simulator using the function is64bitSimulator()         // See http://blog.timac.org/?p=886         sIs64bitHardware = is64bitSimulator(); #else         // The app runs on a real iOS device: ask the kernel for the host info.         struct host_basic_info host_basic_info;         unsigned int count;         kern_return_t returnValue = host_info(mach_host_self(), HOST_BASIC_INFO, (host_info_t)(&host_basic_info), &count);         if(returnValue != KERN_SUCCESS)         {             sIs64bitHardware = NO;         }          sIs64bitHardware = (host_basic_info.cpu_type == CPU_TYPE_ARM64);  #endif // TARGET_IPHONE_SIMULATOR     }      return sIs64bitHardware; } 


回答3:

Totally untested, but you should be able to get the CPU via sysctl like this:

#include  #include  #include   void foo() {     size_t size;     cpu_type_t type;      size = sizeof(type);     sysctlbyname("hw.cputype", &type, &size, NULL, 0);      if (type == CPU_TYPE_ARM64) {         // ARM 64-bit CPU     } else if (type == CPU_TYPE_ARM) {         // ARM 32-bit CPU     } else {         // Something else.     } } 

In the iOS 7 SDK, CPU_TYPE_ARM64 is defined in as:

#define CPU_TYPE_ARM64          (CPU_TYPE_ARM | CPU_ARCH_ABI64) 

A different way seems to be:

#include   void foo() {     host_basic_info_data_t hostInfo;     mach_msg_type_number_t infoCount;      infoCount = HOST_BASIC_INFO_COUNT;     host_info(mach_host_self(), HOST_BASIC_INFO, (host_info_t)&hostInfo, &infoCount);      if (hostInfo.cpu_type == CPU_TYPE_ARM64) {         // ARM 64-bit CPU     } else if (hostInfo.cpu_type == CPU_TYPE_ARM) {         // ARM 32-bit CPU     } else {         // Something else.     } } 


回答4:

If you are compiling with clang, there is another way: just check if __arm__ or __arm64__ is defined.

The example code below is not tested but it should illustrate what I mean by that:

#if defined(__arm__)     NSLog(@"32-bit App"); #elif defined(__arm64__)     NSLog(@"64-bit App"); #else     NSLog(@"Not running ARM"); #endif 

Note that this relies on the fact that current iOS application binaries contain both, 32bit and 64bit binaries in a single container and they will be correctly selected depending on whether your app supports executing 64bit.



回答5:

You can use bitWidth on Int https://developer.apple.com/documentation/swift/int/2885648-bitwidth

static var is32Bit: Bool {     return Int.bitWidth == 32 }  static var is64Bit: Bool {     return Int.bitWidth == 64 } 


回答6:

In runtime you can use something like this

extension UIDevice {     static let is64Bit = MemoryLayout.size == MemoryLayout.size } 


回答7:

I use this in swift 4, not sure if it's the best solution but it works.

   func getCPUArch()    {       #if arch(arm)          print("this is a 32bit system")       #elseif arch(arm64)           print("this is a 64bit system")       #endif    } 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!