4

編集:

H2CO3 からの以下の回答は、私をほとんど幸せにします。しかし、それは 1 つのことを説明していません: SDK6 に対してアプリをビルドするときにランタイム例外が発生するのはなぜですか (UIPageViewController は、親コントローラーに追加する前に 1 つの子コントローラーが必要です)、SDK5 に対してビルドするときはそうではありませんか? Rolf からの回答は、何が起こっているかを説明しています。デバイスは、アプリが構築された SDK を認識し、最大限の互換性を確保するために異なる動作をします。

iOS SDK のバージョン、MonoTouch のバージョン、およびさまざまな iOS のバージョンと格闘しているうちに、「結局、iOS SDK とは何なのか? 」と考え始めました。

つまり、Xcode 4.4 をインストールすると、iOS SDK 5 が取得されます。Xcode 4.5 をインストールすると、iOS SDK 6 が取得されます。これまでのところ問題はありません。

  • ここで、何かを実行するアプリを作成するtargets iOS 5としnot use any iOS 6 specificます。私はこのアプリを構築しusing iOS SDK 6ます。
  • 次に、ビルドしますsame appが、使用しますiOS SDK 5

次に、両方のバージョンのアプリを iOS 6 デバイスで実行します。

なぜ彼らは異なる振る舞いをするのですか?小さな違いがあります。たとえば、ページ ビュー コントローラーを子として親コントローラーに追加する前に子コントローラーが設定されていない場合、UIPageViewController は例外をスローします。

私の理解では、コールバック、機能、およびすべては、SDK からではなく、iOS オペレーティング システムからのものです。ただし、OSはどちらの場合も同じです。

iOS 6 固有の機能を使用したい場合は、SDK 5 には UICollectionView が存在しないため、iOS SDK 6 を使用する必要があることを完全に理解しています。しかし、このビューの UI コードは明らかにアプリに含まれていません。それ以外の場合は、iOS5 でも動作します。したがって、コレクション ビューは、OS によって提供される共有ライブラリから取得されます。

その上に、MonoTouch があります。MonoTouch の各バージョンが、バグを修正していないバインディングの拡張にすぎないと仮定すると、どの MT バージョンを使用しても問題ありません。

私の質問の要約は次のとおりです: iOS バージョン、iOS SDK バージョン、MonoTouch バージョン、およびアプリケーションのターゲット バージョンはどのように連携しますか?

4

2 に答える 2

5

iOS SDK は 2 つのコンポーネントで構成されています: ツールチェーン (コンパイラとしての Clang および/または GCC、リンカとしての ld(64) およびcctoolsパッケージの他の部分 (GNU の人々はそれを と呼びますbinutils) およびライブラリとヘッダー ファイルです。

ツールチェーン (コンパイラ) のバージョンは、厳密には iOS のバージョン番号とは関係ありません。理論的には、十分な数のクロス コンパイラがあれば、どの iOS 用のコードもビルドできます (ただし、実際には、ライブラリ関数名、クラス、メソッド セレクタのハードコーディングなど、Apple がコンパイラを設計する際に犯した間違いから生じる例外と制限があります)。 .)。

ヘッダー ファイルとライブラリ (Apple 固有の「フレームワーク」タイプのライブラリを含む) は、基本的に、iOS の と ディレクトリ/usr/include/usr/libコピーです。(これも完全に正しいわけではありません。iOS では、 dyld 共有キャッシュ/System/Library/Frameworksが導入されたため、iOS 3 のヘッダー ファイルと iOS 3.1 のライブラリは存在しません)。これらは基本的に、iOS の特定のバージョンで使用できる関数、クラス、およびメソッドをコンパイラとリンカーに伝えます。ヘッダー ファイルはコンパイル時の検証用であり、ライブラリはリンケージ時の検証用です。基本的に、コードをクロスコンパイルする必要のない通常の非組み込みシステム (デスクトップなど) では、「SDK」は基本的にオペレーティング システム自体の同じファイルを意味します。、そしてそれは「SDK」とは呼ばれません。むしろ「sysroot」と呼ばれます。

于 2012-10-29T09:34:25.573 に答える
2

理論的には、iOS 5 から iOS 6 SDK に切り替えても違いは見られないはずです。実際には、少し異なります。

  1. デバイスは、使用した SDK を認識しています。これは、デバイス自体が異なる動作を決定できることを意味します (Apple がそれを良い考えだと判断した理由は何であれ)。
  2. 別のツールチェーン (gcc および関連するバイナリ) を使用しており、コンパイル方法が異なる場合があります (これはまれですが、実際に発生したことはありません)。
  3. MonoTouch 自体は異なる動作をする可能性があります (今のところ何も思い浮かびませんが、たとえば、展開ターゲットなどに異なる既定値を使用する場合があります (もちろん、自分で設定していない場合))。

最初のケースに遭遇していると思います-AppleはiOS6のUI階層にいくつかの制限を追加しました。これは、iOS 6 SDKに対してビルドした場合にのみ適用されます(既存のアプリを壊さないため)。

于 2012-10-29T12:08:14.567 に答える