web-dev-qa-db-ja.com

iOS5 SDKの自動参照カウントに関するいくつかの質問

現在、iPad用のアプリを開発しています。開発はiOS 4.2で開始され、現在iOS 4.3でも継続されています(そして、完了すると思います)。 iOS 5のARCについて読んだところ、基本的に、オブジェクトをリリースして保持する必要がなくなることを理解しました。私の質問は:

  1. IOS 5にアップグレードする場合、コードからすべての[myObject retain]および[myObject release]ステートメントを削除する必要がありますか?

  2. ARCを使用してiOS 5用の新しいアプリを開発する場合、何らかの「レトロ互換性」チェックを実装する必要がありますか?つまり、iOSのバージョンを確認し、それに応じてリテインとリリースを呼び出す必要がありますか?それで、基本的に、ARCはすべてのiOSバージョンで利用できますか、それともiOS 5だけで利用できますか?

134
Luke47

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

150

Q1:いいえ、既存のコードがある場合、-fno-objc-arcを使用してそのまま使用できます。任意のファイルでARCを選択的に無効にできます。

ARCを無効にする on MULTIPLEファイルが必要な場合:

  1. Xcodeのターゲット/ビルドフェーズ/コンパイルソースで目的のファイルを選択します
  2. ENTERを押す。 (ダブルクリックすると1つのファイルのみが選択されます)
  3. タイプ-fno-objc-arc
  4. EnterまたはDoneを押します

Q2:いいえ、ターゲットはiOS 4.0まで低くできます

8
Tibidabo

私が理解している限り、およびiOS 5とiOS 4.3をそれぞれ実行している私のiPhone/iPodが機能する限り、それはすべて完全に自動です。 4.0用に開始し、iOS 5.0用のXcodeで動作するように「更新」されたアプリは、すべてのdeallocなどに関係なく、リリースおよび保持に関する警告を一切投げません。ただし、挿入したコードの一部(ファイルをコピーして)新しいプロジェクトに作成済み iOS 5のXcodeでは、多くの警告があります。したがって、これらの呼び出しをすべて削除する必要はないようです。いいえ、古いバージョンに自動的に適応します。 iPodのプロファイリングを行っても、メモリリークやその他の割り当て解除/解放の失敗の兆候は見られません。これは役立ちますか?

7
Dylan Gattey

あなたの質問のこの部分について

ARCを使用してiOS 5用の新しいアプリを開発する場合、何らかの「レトロ互換性」チェックを実装する必要がありますか?つまり、iOSのバージョンを確認し、それに応じてリテインとリリースを呼び出す必要がありますか?それで、基本的に、ARCはすべてのiOSバージョンで利用できますか、それともiOS 5だけで利用できますか?

IOS 5コンパイラは「retro-compatibility」(実際には保持/リリースを機能させるためにコードを実際に追加します)を使用しますが、iOS 5.0用にコンパイルしていない場合は、weakをキーワードとして。代わりにassignを使用します。これは残念です:weakは大きな利点です(ダングリングポインターはありません!)。 weakassign、およびARCの説明については、私の質問 here を参照してください。

5
Dan Rosenstark

新しい-fobjc-arcコンパイラフラグを使用せずにARCを無効にできる場合、コードを前方に書き直す必要はありません-私は推測します(?)

2
oliver