iOS 5 以降のメモリ管理について心配する必要はありませんか? また、iOS 4 以前のバージョン用に作成されたすべてのプログラムは、iOS がメモリを管理できるように書き直す必要がありますか?
3 に答える
他の回答で言及されている自動参照カウントについて話しているようです。ARC は、メモリの解放を自動化するという点で GC の一種ですが、優れたガベージ コレクターとはいくつかの違いがあります。
まず、主にコンパイラ技術です。コンパイラは、Cocoa の参照カウントのガイドラインを認識しているため、ルールに従って、あるべき場所に保持と解放を挿入します。これは、retain と release を自分で記述した場合と同じように機能します — 単純にそれらを挿入します。通常のガベージ コレクタは、実行中のプログラムのメモリを追跡します。
次に、retain と release に似ているため、retain サイクルをキャッチできません (オブジェクト A がオブジェクト B を保持し、オブジェクト B がオブジェクト A を保持し、他に何も参照していない場合、それらは両方とも不滅になります)。それらを防ぐために、同じ予防措置を講じる必要があります。
また、自動ガベージ コレクターとは異なる方法でリソースを使用します。Objective-C で使用されるガベージ コレクターは、参照されていないメモリをスキャンして収集する必要があります — これは高価であり、遅いシステムでは「スタッタリング」につながる可能性があります — しかし、これを行う必要があるのはたまにだけであり、理論的には微調整することさえできますプログラムが実際にそのメモリを使用する方法と一致するように収集サイクルを調整します。一般に、GC プログラムは非 GC プログラムよりも多くのメモリを使用し、GC が収集を決定すると速度が大幅に低下します。一方、ARC は「スキャン」をコンパイル時に行い、メモリが利用可能になるとすぐに解放しますが、ガベージがコレクタのように蓄積するのを待つのではなく、オブジェクト参照カウントを常に更新する必要があります。
Apple の公開 iOS 5 ページで、彼らは次のように述べています。
自動参照カウント
Objective-C の自動参照カウント (ARC) により、メモリ管理がコンパイラの仕事になります。新しい Apple LLVM コンパイラで ARC を有効にすると、retain や release を再度入力する必要がなくなり、開発プロセスが大幅に簡素化され、クラッシュやメモリ リークが減少します。コンパイラはオブジェクトを完全に理解しており、各オブジェクトが使用されなくなった時点ですぐに解放するため、アプリはこれまでと同じように高速に実行され、予測可能なスムーズなパフォーマンスが得られます。
これはコンパイラの機能です。OS の機能ではないため、古いバージョンで動作しない理由がわかりません。
自動参照カウントは、Objective-C オブジェクトおよびブロックの自動メモリ管理を実装し、プログラマーを明示的に挿入保持および解放する必要から解放します。
メモリ管理について心配する必要がなくなります。この件に関して利用可能な公開情報があります:
- ARC が GC に取って代わる?(lists.apple.com)
- 自動参照カウント(clang.llvm.org)。これは ARC の技術仕様です。
仕様が読みにくい場合は、要するに、保持/解放コードを編集して ARC を使用する必要がありますが、古いプログラムは互換性を保ちます。してはいけないことは、両方を混在させることです。