Xcode 5で新しいプロジェクトを開始しています。iOS SDK 7
を使用してアプリケーションを開発しますが、展開ターゲットはiOS 5.0
です。 Xcodeで新しいプロジェクトを作成し、展開ターゲットを5.0に変更しようとすると、すぐに次のメッセージが表示されます。
Applications including an arm64 slice are not compatible with versions of iOS
prior to 6.0
Adjust your Architectures build setting to not include arm64 in order to deploy
to releases prior to iOS 6.0.
そのため、アーキテクチャをStandard
name__(64ビットなし)に変更しました。コンパイルして実行しますが、何が起こったのか本当にわかりません。
Xcodeプロジェクトのビルド設定のArchitectures
name__設定とValid architectures
設定の違いは何ですか?Architectures
name__を設定して64ビットを除外すると、64ビットのiPhoneまたはiOSシミュレーターでアプリを実行したときに何が起こるかがわかります(動作することはわかっていますが、下に何があるのか興味があります)。
新しい64ビットアーキテクチャの大きな混乱を説明できますか?
ビルド設定でアーキテクチャをに設定します標準アーキテクチャ(armv7、armv7s)
iPhone 5Sは、A7 64ビットプロセッサを搭載しています。 Apple docs から
Xcodeは、32ビットと64ビットの両方のバイナリを含むアプリをビルドできます。この結合されたバイナリには、iOS 7以降の最小展開ターゲットが必要です。
注:Xcodeの将来のバージョンでは、iOS 6以降で32ビットランタイムをサポートし、iOS 7で64ビットランタイムをサポートする単一のアプリを作成できるようになります。
私が理解したドキュメントから
アップデート(Xcode 5.0.1)
Xcode 5.0.1では、iOS 5.1.1以降の64ビットバイナリを作成するためのサポートが追加されました。
Xcode 5.0.1は、32ビットと64ビットの両方のバイナリを含むアプリをビルドできます。この結合されたバイナリには、iOS 5.1.1以降の最小展開ターゲットが必要です。 64ビットバイナリは、iOS 7.0.3以降を実行している64ビットデバイスでのみ実行されます。
アップデート(Xcode 5.1)
Xcode 5.1は、アーキテクチャセクションに大きな変更を加えました。この answer はフォローアップになります。 チェックしてください
64ビットを設定すると、結果のバイナリは「Fat」バイナリになります。これには、3つのMach-Oイメージがすべてシンファットヘッダーにバンドルされています。 otoolまたはjtoolを使用してそれを確認できます。次のように、iOS 7.0 SDKの一部として含まれているいくつかのファットバイナリ、たとえばAVFoundation Frameworkをチェックアウトできます。
% cd /Developer/Platforms/iPhoneOS.platform/DeviceSupport/7.0\ \(11A465\)/Symbols/System/Library/Frameworks/AVFoundation.framework/
%otool -V -f AVFoundation 9:36
Fat headers
fat_magic FAT_MAGIC
nfat_Arch 3
architecture arm64 # The 64-bit version (A7)
cputype CPU_TYPE_ARM64
cpusubtype CPU_SUBTYPE_ARM64_ALL
capabilities 0x0
offset 16384
size 2329888
align 2^14 (16384)
architecture armv7 # A5X - packaged after the arm64version
cputype CPU_TYPE_ARM
cpusubtype CPU_SUBTYPE_ARM_V7
capabilities 0x0
offset 2359296
size 2046336
align 2^14 (16384)
architecture armv7s # A6 - packaged after the armv7 version
cputype CPU_TYPE_ARM
cpusubtype CPU_SUBTYPE_ARM_V7S
capabilities 0x0
offset 4407296
size 2046176
align 2^14 (16384)
バイナリ自体に関しては、ARM64ビット命令セットを使用します(ほとんどの場合32ビットと互換性がありますが、まったく異なる命令セットです)。これは、グラフィックプログラムでは特に重要です(NEON命令とレジスタを使用)。同様に、CPUにはより多くのレジスタがあり、プログラムの速度に大きな影響を与えます。 http://blogs.barrons.com/techtraderdaily/2013/09/19/Apple-the-64-bit-question/?mod=yahoobarrons で興味深い議論があります違い;ベンチマークテストは、これまでのところ明確に示しています。
Otool -tVを使用すると、アセンブリがダンプされ(XCode 5以降を使用している場合)、命令セットの違いを自分で確認できます。ほとんど(すべてではない)の開発者は、Obj-C(それにもかかわらずCG * API)に直接影響を与えず、低レベルのポインター処理でより多くのことをしなければならないため、変更にとらわれません。コンパイラーは、その魔法と最適化を実行します。
Appleドキュメントからの私の理解。
有効なアーキテクチャ(VALID_ARCHS)とXcodeビルド設定とは何ですか?
例:-1つのiOSプロジェクトには、Xcodeへの次のビルド設定があります。
サポートされているアーキテクチャからarm64設定を削除することで、コンパイラをarmv7およびarmv7sのみに制限する必要はありません。 Deployment target設定を5.1.1に設定するだけです
重要な注記:Build SettingsセクションでDeployment targetを5.1.1に設定することはできません。これは固定値のドロップダウンのみであるためです。ただし、テキストフィールドに値を入力するだけで、アプリケーション設定のGeneralセクションで簡単に5.1.1に設定できます。
簡単な修正:
ターゲット->ビルド設定->ビルドオプション->ビットコードを有効にする->いいえ
IOS 9.3.3を搭載したデバイスで動作します