135

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

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

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

4

5 に答える 5

150

iOS 5 にアップグレードすることにした場合、コードから [myObject preserve] および [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 ビット アプリケーション) および iOS 4 および iOS 5 の Xcode 4.2 でサポートされています (弱い参照は、Mac OS X v10.6 および iOS 4 ではサポートされていません)。Xcode 4.1 では ARC はサポートされていません。

-

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

いいえ、ARC は実行時ではなくコンパイル時にマジックを実行するためです。

ARC は、retain、release、および autorelease をいつ使用するかを覚えておく必要はありません。ARC は、オブジェクトの有効期間要件を評価し、コンパイル時に適切なメソッド呼び出しを自動的に挿入します。コンパイラは、適切な dealloc メソッドも生成します。

ARC に関する詳細情報: http://clang.llvm.org/docs/AutomaticReferenceCounting.html

于 2011-06-16T07:51:27.747 に答える
8

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

複数のファイルでARC を無効する場合:

  1. Xcode の Target/Build Phases/Compile Sources で目的のファイルを選択します
  2. ENTERを押します。(ダブルクリックで 1 つのファイルのみが選択されます)
  3. -fno -objc-arc と入力します
  4. Enterまたは完了を押します

Q2: いいえ、ターゲットは iOS 4.0 まで下げることができます

于 2012-05-02T07:50:19.177 に答える
6

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

于 2011-06-16T07:47:46.713 に答える
5

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

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

iOS 5 コンパイラは「レトロ互換性」を採用していることに注意してください (実際には、保持/解放を機能させるコードを追加します)。ただし、iOS 5.0 用にコンパイルしていない場合weakは、キーワードとして. 代わりに を使用しますassign。これは残念なことです: これはweak大きなアドバンテージです (ダングリングポインターはありません!)。、および ARCの説明については、こちらの質問を参照してください。weakassign

于 2011-10-12T12:56:29.140 に答える
2

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

于 2011-11-07T09:47:19.230 に答える