iPhone 将选择哪个切片
Which slice will be picked by an iPhone
我有一个 .ipa
,里面有 arm64
和 armv
7 个切片。如果我 运行 它在同时支持 arm64
和 armv7
的 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:
- "The compiler defines the
__LP64__
macro when compiling for the 64-bit runtime",以及
- "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);
我之前看到这个问题,如果你看看这个问题的评论,我认为它是相关的:
在链接问题的情况下,虽然已经过时,但答案都是。每个文件将构建两次,这可以在构建设置中手动更改(仅构建活动架构)。
我有一个 .ipa
,里面有 arm64
和 armv
7 个切片。如果我 运行 它在同时支持 arm64
和 armv7
的 iDevice 上使用,哪个切片将在 运行 时间之前被选取?
我可以通过打印 NSLog
或某种方式来了解 运行time has picked slice arm64
吗?
如果您的应用程序是通过启用了字节码的 App Store 下载的,那么 iTunes 连接会让 iOS 设备根据您的设备架构下载适当的二进制文件。
如果您通过 Xcode 进行部署,请检查此选项:
如果你有那个选项 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:
- "The compiler defines the
__LP64__
macro when compiling for the 64-bit runtime",以及 - "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);
我之前看到这个问题,如果你看看这个问题的评论,我认为它是相关的:
在链接问题的情况下,虽然已经过时,但答案都是。每个文件将构建两次,这可以在构建设置中手动更改(仅构建活动架构)。