可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
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 }