3

これは、私の ARC の概念的理解におけるいくつかの疑問を解消するためのものです。ARC がコンパイル時のテクノロジである場合、iOS および OS X のすべてのバージョンで使用できないのはなぜですか?

4

2 に答える 2

6

ARCは単なるコンパイル時テクノロジではありません。また、いくつかのランタイムコンポーネントに依存しています。これには2つの部分があります。

  1. 参照カウント。コンパイル時に、ARCは一連のヘルパー関数への呼び出しを導入します。これらはすべてオンラインで文書化されていますが、重要なものは、、、objc_retain()およびobjc_release()ですobjc_autorelease()。これらは、、、またはオブジェクトの呼び出し-retainと同じことを行いますが、ランタイム関数を使用してARCで実行できるいくつかの追加の最適化があります(特に、メソッドが自動解放されたオブジェクトを返し、呼び出し元が値を強力な変数に格納する場合、自動解放+保持は完全にスキップできる場合があります)。これらのランタイム関数は、OS要件を追加するものです。幸い、古いOSをターゲットにしている場合、Xcodeはと呼ばれる静的ライブラリにリンクできます。-release-autoreleaselibarcliteこれらの機能の実装を提供するため、古いOS(iOS 4.3など)をターゲットにするときにARCを使用できます。欠点は、これらの関数には「真の」ARCのような最適化がないため、パフォーマンスがわずかに低下する可能性があることです。

  2. 弱参照サポートをゼロにします。これには、一連のランタイム関数に加えて、ランタイムでのメモリ管理の動作の内部へのいくつかの変更に加えて、弱参照のゼロ化をより適切にサポートするためのフレームワークへのいくつかの変更も必要です。libarclite特にメモリ管理の変更は、弱参照サポートのゼロ化が他のARCのようにバックポートできない理由です。

于 2013-01-08T05:03:49.293 に答える
2

ARC には、いくつかのランタイム関数が存在する必要があります。これらの関数は、clang ARC のドキュメントにあります。

iOS 5.0 および Mac OS X 10.7 (およびそれ以降のバージョン) には、これらの機能が含まれています。

アプリを古い OS バージョンに展開できるようにするために、Apple には、これらの機能のほとんどを定義する「arclite」と呼ばれる静的ライブラリが含まれています。展開ターゲットが古い OS の場合、Xcode はアプリを arclite にリンクします。

なぜ arclite はすべての古いバージョンの iOS と OS X で動作しないのですか? 確かなことはわかりません (おそらく、Apple 以外の誰も知りません)。合理的な推測の 1 つは、arclite を Objective-C ランタイムにフックする必要があるということです。ランタイムは、OS のバージョン間で異なる場合があります。Apple は、これまでに出荷したランタイムのすべてのバージョンをサポートしようとしたくなかったので、合理的なカットオフを選択し、それらのカットオフ以降のすべてのバージョンを arclite でサポートするようにしました。これにより、arclite の実装が簡素化され、テストの負担が軽減されます。

arclite には、弱い参照のゼロ化のサポートが含まれていないことに注意してください。おそらくこれは、カットオフ後のバージョンであっても、ランタイムの古いバージョンでサポートするのが難しすぎた機能です。

于 2013-01-08T05:04:28.140 に答える