web-dev-qa-db-ja.com

Objective-Cの自動参照カウントとガベージコレクションの違いは何ですか?

Xcode 4.2で導入された新しい自動参照カウント(ARC)により、Objective-Cで保持/リリースを手動で管理する必要がなくなりました。

これはMacのObjective-Cや他の言語で行われるガベージコレクションに似ています。 ARCとガベージコレクションの違いは何ですか?

55
Gauging

私の答え here で説明しているように、ARCは手動メモリ管理とトレースガベージコレクションの両方のベストを提供できます。ほとんどの場合、開発者がObjective-Cオブジェクトの手動の保持、リリース、および自動リリースを追跡する必要がなくなりますが、モバイルデバイスの限られたリソースを使い果たし、実行中のアプリケーションでときどきスタッターが発生するガベージコレクタープロセスの必要性が回避されます。

ARCは、すべてのObjective-C開発者が長年にわたって使用しなければならなかったルールを適用することにより、コンパイル時に参照カウントに必要な適切な保持とリリースを挿入します。これにより、開発者はこれを自分で管理する必要がなくなります。保持および解放はコンパイル時に挿入されるため、メモリを継続的にスイープし、参照されていないオブジェクトを削除するためのコレクタプロセスは必要ありません。

ARCに対するガベージコレクションのトレースのわずかな利点は、ARC 保持サイクルを処理しません であり、ガベージコレクションをトレースするとこれらを取得できることです。

このテーマに関する素晴らしい読み物は AppleのObjective-Cメーリングリストのこのスレッド から来ています。

GCのARCに対する主な利点は、保持サイクルを収集することです。副次的な利点は、「保持」割り当てが単純なストアであるため「アトミック」であることです。 ARCには、libauto GCに比べていくつかの大きな利点があります。

  1. オブジェクトの確定的な再利用(オブジェクトへの最後の強い参照がなくなるとき)があり、GCは「しばらくして」オブジェクトを解放します。これは、コレクターが「バグの多いウィンドウ」でトリガーしないために公開されないGCアプリに存在する可能性のある微妙なバグのクラスを定義します。
  2. オブジェクトがより早く解放されるため、最高水準点は一般にGCよりもARCではるかに低くなります。
  3. libautoは脆弱なプログラミングモデルを提供します。書き込みバリアなどを失わないように注意する必要があります。
  4. すべてのシステムフレームワークがGCクリーンであるとは限らず、フレームワークは進化するにつれて時折退行します。
  5. ARCには偽のルートはありません。 libautoはスタックを保守的にスキャンします。つまり、ポインターのように見える整数はオブジェクトグラフをルート化できます。
  6. ARCには、アプリを起動および停止するものが何もないため、UIが途切れます。 libautoは、すべてのスレッドをすぐに停止するわけではないため、GCの実装に関してはかなり進歩していますが、通常はすべてのUIスレッドを停止することになります。

現在、手動でメモリ管理されているプロジェクトとObjective-Cガベージコレクションを使用しているプロジェクトの両方をARCに移行しています。しばらくの間、いくつかのMacアプリケーションでガベージコレクションを使用した後、これらのプロジェクトをARCに移行することでいくつかの重要な利点があります。

64
Brad Larson

[〜#〜] arc [〜#〜]コンパイル時の「参照」オブジェクトに依存しており、低電力モード環境(モバイルデバイス)で効率的になります。

[〜#〜] gc [〜#〜]ランタイムベースの「到達可能な」オブジェクトに依存しているため、マルチスレッド環境で効率的です。

操作

ARCは、参照カウントに応じて、未使用のオブジェクトに対して「自動的に」実行されるコードを実行可能ファイルに挿入します。

GCは未使用のオブジェクトグラフを検出し(保持サイクルを削除します)、不定の時間間隔でそれらを削除するため、ランタイムで動作します

自動参照カウントの利点

  • 使用されなくなったオブジェクトのリアルタイムの決定論的な破壊。
  • バックグラウンド処理なし。

ガベージコレクションの利点

  • GCは、保持サイクルを含むオブジェクトグラフ全体をクリーンアップできます。
  • GCはバックグラウンドで進行するため、通常のアプリケーションフローの一部として行われるメモリ管理作業が少なくなります。

自動参照カウントの欠点

  • ARCは保持サイクルを自動的に処理できません。

ガベージコレクションの欠点

  • GCはバックグラウンドで行われるため、オブジェクトのリリースの正確な時間枠は不明です。
  • GCが発生すると、アプリケーション内の他のスレッドが一時的に保留される場合があります。
12
Meseery

ARCとガベージコレクションの違いは何ですか?

ARCは、ガベージコレクションの一種です。

「ARCとトレースガベージコレクション(JVMや.NETなど)の違いは何ですか?」主な違いは、ARCの方が遅く、サイクルをリークすることです。 JVMと.NETの両方がトレースガベージコレクターを使用する理由です。詳細については、 参照カウントとトレースガベージコレクションの比較方法 を参照してください。

7
Jon Harrop