現在、iPad用のアプリを開発しています。開発はiOS 4.2で開始され、現在iOS 4.3でも継続されています(そして、完了すると思います)。 iOS 5のARCについて読んだところ、基本的に、オブジェクトをリリースして保持する必要がなくなることを理解しました。私の質問は:
IOS 5にアップグレードする場合、コードからすべての[myObject retain]
および[myObject release]
ステートメントを削除する必要がありますか?
ARCを使用してiOS 5用の新しいアプリを開発する場合、何らかの「レトロ互換性」チェックを実装する必要がありますか?つまり、iOSのバージョンを確認し、それに応じてリテインとリリースを呼び出す必要がありますか?それで、基本的に、ARCはすべてのiOSバージョンで利用できますか、それともiOS 5だけで利用できますか?
iOS 5にアップグレードする場合、コードからすべての[myObject retain]および[myObject release]ステートメントを削除する必要がありますか?
はい。ただし、XCode 4.2には新しい「Objective-C ARCへの移行」ツール([編集]> [リファクタリング]メニュー)が含まれています。 deallocの呼び出しは別の話です。コメントで述べたように、clangリファレンスにはdeallocメソッドを保持する必要があると記載されています。
理由:ARCはインスタンス変数を自動的に破棄しますが、保持できないリソースを解放するなど、deallocメソッドを記述する正当な理由がまだあります。そのようなメソッドで[super dealloc]の呼び出しに失敗すると、ほとんど常にバグになります。
新しい-fobjc-arcコンパイラフラグを使用してARCを有効にします。 ARCは、Mac OS X v10.6およびv10.7(64ビットアプリケーション)およびiOS 4およびiOS 5のXcode 4.2でサポートされています(弱い参照は、Mac OS X v10.6およびiOS 4ではサポートされていません)。 Xcode 4.1にはARCはサポートされていません。
-
ARCを使用してiOS 5用の新しいアプリを開発する場合、何らかの「レトロ互換性」チェックを実装する必要がありますか?つまり、iOSのバージョンを確認し、それに応じてリテインとリリースを呼び出す必要がありますか?それで、基本的に、ARCはすべてのiOSバージョンで利用できますか、それともiOS 5だけで利用できますか?
いいえ、ARCは実行時ではなくコンパイル時に魔法をかけるからです。
ARCは、retain、release、およびautoreleaseをいつ使用するかを覚える必要はなく、オブジェクトの有効期間要件を評価し、コンパイル時に適切なメソッド呼び出しを自動的に挿入します。コンパイラーは、適切なdeallocメソッドも生成します。
ARCに関する詳細情報: http://clang.llvm.org/docs/AutomaticReferenceCounting.html
Q1:いいえ、既存のコードがある場合、-fno-objc-arcを使用してそのまま使用できます。任意のファイルでARCを選択的に無効にできます。
ARCを無効にする on MULTIPLEファイルが必要な場合:
Q2:いいえ、ターゲットはiOS 4.0まで低くできます
私が理解している限り、およびiOS 5とiOS 4.3をそれぞれ実行している私のiPhone/iPodが機能する限り、それはすべて完全に自動です。 4.0用に開始し、iOS 5.0用のXcodeで動作するように「更新」されたアプリは、すべてのdeallocなどに関係なく、リリースおよび保持に関する警告を一切投げません。ただし、挿入したコードの一部(ファイルをコピーして)新しいプロジェクトに作成済み iOS 5のXcodeでは、多くの警告があります。したがって、これらの呼び出しをすべて削除する必要はないようです。いいえ、古いバージョンに自動的に適応します。 iPodのプロファイリングを行っても、メモリリークやその他の割り当て解除/解放の失敗の兆候は見られません。これは役立ちますか?
あなたの質問のこの部分について
ARCを使用してiOS 5用の新しいアプリを開発する場合、何らかの「レトロ互換性」チェックを実装する必要がありますか?つまり、iOSのバージョンを確認し、それに応じてリテインとリリースを呼び出す必要がありますか?それで、基本的に、ARCはすべてのiOSバージョンで利用できますか、それともiOS 5だけで利用できますか?
IOS 5コンパイラは「retro-compatibility」(実際には保持/リリースを機能させるためにコードを実際に追加します)を使用しますが、iOS 5.0用にコンパイルしていない場合は、weak
をキーワードとして。代わりにassign
を使用します。これは残念です:weak
は大きな利点です(ダングリングポインターはありません!)。 weak
、assign
、およびARCの説明については、私の質問 here を参照してください。
新しい-fobjc-arcコンパイラフラグを使用せずにARCを無効にできる場合、コードを前方に書き直す必要はありません-私は推測します(?)