iPhone 将选择哪个切片

Which slice will be picked by an iPhone

我有一个 .ipa,里面有 arm64armv7 个切片。如果我 运行 它在同时支持 arm64armv7 的 iDevice 上使用,哪个切片将在 运行 时间之前被选取?

我可以通过打印 NSLog 或某种方式来了解 运行time has picked slice arm64 吗?

如果您的应用程序是通过启用了字节码的 App Store 下载的,那么 iTunes 连接会让 iOS 设备根据您的设备架构下载适当的二进制文件。

如果您通过 Xcode 进行部署,请检查此选项: 它只会根据您的 iOS 设备架构进行编译。

如果你有那个选项 NO 那么你可以测试哪个二进制架构是 运行:

if(sizeof(int*) == 4)
    NSLog(@"32 bit arch");
else if(sizeof(int*) == 8)
    NSLog(@"64 bit arch");

使用此代码查找如何?

#if TARGET_OS_SIMULATOR


#else
if(sizeof(void *) == 4)
{
  NSLog(@" This is a 32 bit architecture so most probably this armv7 ");
}
else if (sizeof(void *) == 8)
{
  NSLog(@" This is a 64 bit architecture so most probably this is arm64 ");
}
else
{
  NSLog(@" Unrecognized architecture ");
}
#endif

根据Apple

  1. "The compiler defines the __LP64__ macro when compiling for the 64-bit runtime",以及
  2. "The size of pointers increased from 4 bytes to 8 bytes"(从 ILP32 到 LP64 时)。

如果您有兴趣确定 compile-time 的架构,基本上会出现以下代码(来自谷歌搜索):

#if __LP64__
// Being compiled for LP64 (64-bit arm64)
#else
// Being compiled for ILP32 (32-bit armv7)
#endif

然而,当您要求进行 run-time 测试时,使用 size-of-pointer 确定技术(根据我上面链接的 Apple 指南页面确认)是一种方法。 Manish 或 Hashmat 建议的代码说明了方法。

你可以这样试试。您将不得不添加 cpu_type_t.

的更多选项
func getCPUType() -> String {

var size: size_t = 0
var type: cpu_type_t = 0
var subtype: cpu_subtype_t = 0
size = MemoryLayout<cpu_type_t>.size;
sysctlbyname("hw.cputype", &type, &size, nil, 0);

size = MemoryLayout<cpu_subtype_t>.size;
sysctlbyname("hw.cpusubtype", &subtype, &size, nil, 0);

// values for cputype and cpusubtype defined in mach/machine.h
var cpu = ""
if (type == CPU_TYPE_X86)
{
    cpu += "x86"

} else if (type == CPU_TYPE_VAX) {
    cpu += "vax"

} else if (type == CPU_TYPE_ARM) {
    cpu += "ARM"
    switch(subtype)
    {
    case CPU_SUBTYPE_ARM_V7:
        cpu += "V7"
        break;
        // ...
    default: break
    }
}

return cpu
}

已编辑:首先尝试 "hw.cpufamily"

sysctlbyname("hw.cpufamily", &type, &size, nil, 0);

我之前看到这个问题,如果你看看这个问题的评论,我认为它是相关的:

在链接问题的情况下,虽然已经过时,但答案都是。每个文件将构建两次,这可以在构建设置中手动更改(仅构建活动架构)。