检查CPUARM
是正确的解决方案。为模拟器编译的iOS二进制文件不是ARM,而实际上是x86。只需确保用{$IFDEF IOS}
包装您的iOS代码:
{$IFDEF IOS}
{$IFDEF CPUARM}
s := 'iOS device';
{$ELSE}
s := 'iOS Simulator';
{$ENDIF}
{$ENDIF}
Delphi在iOS设备上使用ARM编译器,但在iOS模拟器上使用x86编译器。
Embarcadero的DocWiki上记录了可用的编译器条件:
条件编译(Delphi)|预定义条件
CPUARM
由DCCIOSARM编译器(iOS设备)定义。
CPU386
和CPUX86
由DCCIOS32编译器(iOS模拟器)定义。
查看XE6的DCCIOSARM.EXE和DCCIOS32.EXE可执行文件中实际存在的条件值可以确认这一点:
DCCIOSARM.EXE:
**CPUARM**
DCC
NEXTGEN
AUTOREFCOUNT
WEAKINSTREF
WEAKINTFREF
WEAKREF
EXTERNALLINKER
NATIVECODE
POSIX
POSIX32
MACOS
MACOS32
**IOS**
VER270
CONSOLE
BCB
PIC
UNICODE
CONDITIONALEXPRESSIONS
DCCIOS32.EXE:
**CPU386**
**CPUX86**
DCC
NEXTGEN
AUTOREFCOUNT
WEAKINSTREF
WEAKINTFREF
WEAKREF
NATIVECODE
POSIX
POSIX32
MACOS
MACOS32
**IOS**
ALIGN_STACK
UNDERSCOREIMPORTNAME
PC_MAPPED_EXCEPTIONS
ASSEMBLER
VER270
CONSOLE
BCB
PIC
UNICODE
CONDITIONALEXPRESSIONS
更新:从 Delphi 11.2 开始,基于 ARM 的 iOS 模拟器现在通过新的 DCCIOSSIMARM64 编译器得到支持。您可以使用 IOSSIMULATOR
条件来检查该编译器:
{$IFDEF IOS}
{$IFDEF CPUARM}
{$IFDEF IOSSIMULATOR}
s := 'iOS Simulator (ARM)';
{$ELSE}
s := 'iOS device';
{$ENDIF}
{$ELSE}
s := 'iOS Simulator (x86)';
{$ENDIF}
{$ENDIF}
delphi
标签。也许你曾经想知道为什么你的问题没有引起更多的关注。这就是原因 :o) - Sir Rufo