Determine if iOS device is 32- or 64-bit

前端 未结 7 521
清歌不尽
清歌不尽 2020-12-01 04:03

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,

相关标签:
7条回答
  • 2020-12-01 04:11

    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");
    }
    
    0 讨论(0)
  • 2020-12-01 04:11

    In runtime you can use something like this

    extension UIDevice {
        static let is64Bit = MemoryLayout<Int>.size == MemoryLayout<Int64>.size
    }
    
    0 讨论(0)
  • 2020-12-01 04:12

    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
       }
    
    0 讨论(0)
  • 2020-12-01 04:15

    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.

    0 讨论(0)
  • 2020-12-01 04:27

    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 <mach/mach.h>
    
    + (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;
    }
    
    0 讨论(0)
  • 2020-12-01 04:27

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

    #include <sys/types.h>
    #include <sys/sysctl.h>
    #include <mach/machine.h>
    
    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 <mach/machine.h> as:

    #define CPU_TYPE_ARM64          (CPU_TYPE_ARM | CPU_ARCH_ABI64)
    

    A different way seems to be:

    #include <mach/mach_host.h>
    
    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.
        }
    }
    
    0 讨论(0)
提交回复
热议问题