web-dev-qa-db-ja.com

iOS 5にはガベージコレクションがありますか?

IOS 5以降のメモリ管理について心配する必要はもうありませんか?また、iOS 4以前のバージョン用に作成されたすべてのプログラムは、iOSがメモリを管理できるように書き直す必要がありますか?

21
NSExplorer

あなたは他の回答で言及されている自動参照カウントについて話しているようです。 ARCは、メモリの解放を自動化するという点で一種のGCですが、優れたガベージコレクターとは多くの違いがあります。

まず、それは主にコンパイラ技術です。コンパイラはCocoaの参照カウントのガイドラインを知っているので、ルールに従って、保持と解放を適切な場所に挿入します。自分で保持と解放を作成した場合と同じように機能します。単に挿入するだけです。通常のガベージコレクタは、プログラムの実行中にプログラムのメモリを追跡します。

次に、保持と解放と同じであるため、保持サイクルをキャッチできません(オブジェクトAがオブジェクトBを保持し、オブジェクトBがオブジェクトAを保持し、他にどちらも参照しない場合、両方とも不滅になります)。それらを防ぐために同じ予防策を講じる必要があります。

また、自動ガベージコレクターとは異なる方法でリソースを使用します。 Objective-Cで使用されるガベージコレクターは、参照されていないメモリをスキャンして収集する必要があります。これは高価であり、低速のシステムでは「スタッター」が発生する可能性がありますが、これを行う必要があるのはたまにしかなく、理論的には微調整することもできます。プログラムが実際にメモリを使用する方法と一致するように、それらの収集サイクル。一般に、GCプログラムは非GCプログラムよりも多くのメモリを使用し、GCが収集を決定すると大幅に速度が低下します。一方、ARCは「スキャン」をコンパイル時に移動し、使用可能になるとすぐにメモリを解放しますが、コレクターのようにゴミが蓄積するのを待つのではなく、オブジェクト参照カウントを常に更新する必要があります。

39
Chuck

Appleの パブリックiOS 5ページ で、彼らは次のように述べています:

自動参照カウント

Objective-Cの自動参照カウント(ARC)は、メモリ管理をコンパイラの仕事にします。新しいApple LLVMコンパイラでARCを有効にすることで、retainまたはreleaseを再度入力する必要がなくなり、開発プロセスが大幅に簡素化され、クラッシュやメモリリークが減少します。コンパイラはオブジェクトを作成し、使用されなくなった瞬間に各オブジェクトを解放するため、アプリはこれまでになく高速に実行され、予測可能でスムーズなパフォーマンスが得られます。

これはコンパイラ機能です。 OSの機能ではないので、古いバージョンでは機能しない理由がわかりません。

23
Sophie Alpert

自動参照カウントは、Objective-Cオブジェクトとブロックの自動メモリ管理を実装し、プログラマーが保持と解放を明示的に挿入する必要から解放します。

あなたはメモリ管理について心配するでしょう少ない。この件に関して利用可能な公開情報があります:

仕様が厳しすぎて読めない場合、要するに、ARCを使用するには保持/解放コードを編集する必要がありますが、古いプログラムは互換性があります。あなたがしてはいけないことは両方を混ぜることです。

9
Jano