1. ホーム
  2. オブジェクティブC

[解決済み】新しい自動リファレンスカウント機構はどのように機能するのですか?

2022-04-13 19:21:21

質問

どなたかARCの仕組みを簡単に説明してください。ガベージコレクションとは違うのは分かっているのですが、具体的にどのように動作するのかが気になります。

また、もしARCがパフォーマンスを妨げることなくGCと同じことができるのなら、なぜJavaはGCを使うのでしょうか?なぜARCを使わないのでしょうか?

どうすれば解決するの?

Objective-Cを初めて使う開発者は、どのタイミングでオブジェクトを保持し、解放し、自動解放するかという厳格なルールを学ばなければならない。 これらのルールは、メソッドから返されるオブジェクトのretainカウントを意味する命名規則まで指定されています。 これらのルールを心に刻み、一貫して適用すれば、Objective-Cでのメモリ管理はごく自然なものになりますが、最も経験豊富なCocoa開発者でさえ、ときどき失敗することがあります。

LLVMの開発者は、Clang Static Analyzerで、これらのルールが十分に信頼できるものであり、コードが通るパスの中でメモリリークやオーバーリリースの指摘をするツールを構築できることに気づきました。

自動参照カウント (ARC)は次の論理的ステップです。 もしコンパイラがオブジェクトを保持したり解放したりする場所を認識できるのなら、そのコードを挿入してもらえばいいのではないでしょうか。 コンパイラやその仲間たちが得意とするのは、硬直した反復作業です。 人間は忘れ物やミスをしますが、コンピュータはもっと一貫しています。

しかし、このようなプラットフォームでは、メモリ管理の心配から完全に解放されるわけではありません。 私の回答で、注意すべき主な問題(retain cycles)を説明しました。 こちら そのため、弱いポインタをマークするために、少し考える必要があるかもしれません。 しかし、ARCで得られるものに比べれば、そんなことは些細なことです。

手動メモリ管理とガベージコレクションを比較すると、ARCはretain/releaseコードを書く必要をなくし、ガベージコレクション環境で見られる停止やのこぎり歯のメモリプロファイルを持たず、両者の長所を兼ね備えています。 ガベージコレクションの唯一の利点は、retainサイクルを処理できることと、アトミックプロパティの割り当てが安価であることです。 こちら ). 私は、既存のMacのGCコードをすべてARCの実装に置き換えていることを実感しています。

他の言語に拡張できるかどうかについては、Objective-Cの参照カウントシステムを中心に考えられているようです。 Javaや他の言語に適用するのは難しいかもしれませんが、私は低レベルのコンパイラの詳細について十分に知らないので、そこで断定的なことは言えません。 AppleがLLVMでこの取り組みを推進していることを考えると、他の当事者がこの取り組みに大きなリソースを投入しない限り、Objective-Cが最初に来ることになるでしょう。

WWDCでのお披露目は、開発者に衝撃を与えたので、こんなことができるんだという認識がなかったんですね。 いずれ他のプラットフォームにも登場するかもしれませんが、今のところLLVMとObjective-Cに限定しています。