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


134

現在、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だけで利用できますか?

回答:


150

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

はい。ただし、XCode 4.2には新しい「Migrate to Objective-C ARC」ツール([編集]-> [リファクタリング]メニュー)が含まれています。deallocの呼び出しは別の話です。コメントで述べたように、clangリファレンスには、deallocメソッドを保持する必要があると記載されています。

理論的根拠:ARCはインスタンス変数を自動的に破棄しますが、保持できないリソースを解放するなど、deallocメソッドを作成する正当な理由はまだあります。そのようなメソッドで[super dealloc]を呼び出さないことは、ほとんど常にバグです。

新しい-fobjc-arcコンパイラフラグを使用してARCを有効にします。ARCは、Mac OS X v10.6およびv10.7(64ビットアプリケーション)のXcode 4.2およびiOS 4およびiOS 5でサポートされています(弱い参照はMac OS X v10.6およびiOS 4ではサポートされていません)。Xcode 4.1ではARCはサポートされていません。

-

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

いいえ。ARCは、実行時ではなくコンパイル時に魔法をかけるためです。

保持、解放、自動解放をいつ使用するかを覚えておく代わりに、ARCはオブジェクトのライフタイム要件を評価し、コンパイル時に適切なメソッド呼び出しを自動的に挿入します。コンパイラーは、適切なdeallocメソッドも生成します。

ARCの詳細情報:http : //clang.llvm.org/docs/AutomaticReferenceCounting.html


説明ありがとうございます!
Luke47

4
これは100%正しくありません。ARCを有効にするかどうかを決定するコンパイラスイッチがあります。また、ARCにはランタイムサポートが必要だと思います。そのため、iOS 4.xでアプリを動作させるには、保持とリリースを残し、ARCがオフになっていることを確認する必要があります。
JeremyP 2011年

8
@JeremyP-iOS 4.0は確かにARCアプリケーションのターゲットとしてサポートされているので、その古いプラットフォームに対処するために手動で参照カウントされたコードを保持する必要はありません。iPhone OS 3.xかもしれませんが、5.0が出荷されたら、4.0がリリースされたときの2.xのように、Appleがターゲットプラットフォームとしてのサポートを打ち切ると思います。
ブラッド・ラーソン

5
@Brad iOS4のインストールベースはすでに95%以上です。とにかくiOS3のサポートをやめるのは助かると思います。
ヘンリックP.ヘッセル

2
を削除するのdeallocではなく、すべてreleaseのを削除します[super dealloc]。そして99.9%deallocでオブジェクトを解放するだけなので、削除します。ただし、オブジェクトはまだ実行されていない他のクリーンアップタスクを実行する必要がありますrelease(ファイルを閉じる、オブザーバーを削除するなど)。
Stanislav Yaglo、2011

8

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

あなたがしたい場合は無効にARCMULTIPLEのファイル:

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

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


7

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


最新のベータ版では、実際にすべての割り当て呼び出しを削除するように求められますが、それだけです。あなたはまだ保持/解放することができますが、システムが最後の言葉を持っています。
Dylan Gattey、2011年

5

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

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

iOS 5コンパイラーは「レトロ互換」を採用しています(実際には、保持/解放を機能させるためのコードを実際に追加します)が、iOS 5.0向けにコンパイルしていない場合weakは、キーワードとして使用できません。。代わりにを使用しますassign。これは不幸なことです。これはweak大きな利点です(未解決のポインタはありません!)。とARCの説明については、こちらの質問を参照してください。weakassign


2

新しい-fobjc-arcコンパイラフラグを使用せずにARCを無効にできる場合は、コードを書き直さなくても済みます-たぶん(?)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.