iPhone会挑选哪个切片

时间:2017-01-19 07:49:58

标签: ios iphone architecture armv7 arm64

我有一个.ipa,其中包含arm64armv 7个切片。如果我在支持arm64armv7的iDevice上运行它,哪个切片将被运行时选中?

我可以通过打印NSLog或某种方式来了解运行时已选择切片arm64吗?

5 个答案:

答案 0 :(得分:1)

如果您的应用程序是通过App Store下载并启用了字节代码,则iTunes连接将允许iOS设备根据您的设备架构下载相应的二进制文件。

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

如果你有NO的选项,那么你可以测试正在运行的二进制架构:

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

答案 1 :(得分:1)

根据Apple

  1. "编译器在为64位运行时编译时定义__LP64__宏"和
  2. "指针的大小从4个字节增加到8个字节" (从ILP32转到LP64时)。
  3. 如果您有兴趣在编译时确定架构,基本上会出现以下代码(来自Google搜索):

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

    正如您要求进行运行时测试一样,使用指针大小确定技术(根据我上面链接的Apple指南页确认)是一种方法。 Manish或Hashmat建议的代码显示了如何。

答案 2 :(得分:1)

你可以试试这种方式。您将不得不添加更多cpu_type_t选项。

if (isNegative)
 {
     count = -count;
 }
 return count;

编辑:首先尝试使用“hw.cpufamily”

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
}

答案 3 :(得分:1)

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

Xcode 6.3 builds all swift files twice

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

答案 4 :(得分:0)

如何使用此代码查找?

#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