欠点はありません。これを使って。今日それをしてください。古いコードよりも高速です。古いコードよりも安全です。古いコードより簡単です。ガベージコレクションではありません。GCランタイムのオーバーヘッドはありません。コンパイラーは、保持する必要があるすべての場所に保持と解放を挿入します。しかし、それはあなたよりも賢く、実際に必要でないものを最適化できます(ループを展開したり、一時変数、インライン関数などを削除したりできるのと同じように)。
さて、ここで小さな欠点について説明します。
長期にわたるObjC開発者の場合、ARCコードが表示されると、約1週間はけいれんします。あなたはこれをすぐに乗り越えるでしょう。
Core Foundationコードへのブリッジングには、いくつかの(非常に)複雑な問題があります。をid
として扱うものを処理する場合、少し複雑になりvoid*
ます。C配列のようなものid
は、正しく実行するためにもう少し考える必要があります。ObjCの派手な処理va_args
も問題を引き起こす可能性があります。ObjCポインターの数学に関連するほとんどのことはトリッキーです。いずれにしても、これはあまり必要ありません。
あなたは置くことができませんid
でstruct
。これはかなりまれですが、データのパックに使用されることもあります。
正しいKVC命名に従っていない場合、ARCコードと非ARCコードを混在させると、メモリの問題が発生します。ARCは、KVCネーミングを使用してメモリ管理に関する決定を行います。それがすべてARCコードである場合、両側で同じ「間違った」処理を行うため、問題ではありません。ただし、ARCと非ARCが混在している場合は、不一致があります。
ARCは、ObjC例外のスロー中にメモリをリークします。ObjC例外は、プログラムの終了に非常に近い時間である必要があります。大量のObjC例外をキャッチしている場合は、それらを誤って使用しています。これはを使用し-fobjc-arc-exceptions
て修正できますが、以下で説明するペナルティが発生します。
ARCは、ObjC ++コードでのObjCまたはC ++例外のスロー中にメモリをリークしませんが、これは時間とスペースの両方のパフォーマンスを犠牲にします。これは、ObjC ++の使用を最小限に抑えるための長い理由リストのもう1つです。
ARCは、iPhoneOS 3またはMac OS X 10.5以前ではまったく機能しません。(これにより、多くのプロジェクトでARCを使用できなくなります。)
__weak
ポインタはiOS 4またはMac OS X 10.6では正しく機能しません。これは残念ですが、かなり簡単に回避できます。__weak
ポインターは素晴らしいですが、ARCの最大のセールスポイントではありません。
95%以上のコードについては、ARCは優れており、それを回避する理由はまったくありません(OSバージョンの制限を処理できる場合)。ARC以外のコードの場合、-fno-objc-arc
ファイルごとに渡すことができます。残念ながら、Xcodeを使用すると、実際に行うよりもはるかに困難になります。これを簡略化するには、おそらく非ARCコードを別のxcodeprojに移動する必要があります。
結論として、できる限り早くARCに切り替えてください。
編集
「ARCを使用することは、Cocoaのメモリ管理ルールを知ることの代わりにはならない」というコメントを2度目にしました。これはほとんどの場合真実ですが、その理由とそうでない理由を理解することが重要です。まず、すべてのコードがARCを使用していて、3つの魔法の言葉に違反している場合いたるところに問題はありません。と言って衝撃的ですが、そこに行きます。ARCは、保持するつもりでなかったいくつかのことを保持する可能性がありますが、それらも解放するため、重要ではありません。今日、Cocoaで新しいクラスを教えているとしたら、実際のメモリ管理規則に費やす時間は5分以内であり、KVCの命名については、メモリ管理の命名規則についてのみ言及するでしょう。ARCがあれば、メモリ管理のルールをまったく学ばなくても、まともな初心者プログラマになることができると思います。
しかし、あなたはまともな中間プログラマーになることができませんでした。Core Foundationと正しく橋渡しするためにはルールを知る必要があり、すべての中間プログラマーはある時点でCFに対処する必要があります。そして、ARC / MRC混合コードのルールを知る必要があります。また、void*
ポインタid
(KVOを正しく実行するために引き続き必要)をいじり始めるときのルールを知っておく必要があります。そして、ブロック...まあ、ブロックメモリ管理は奇妙です。
したがって、私のポイントは、基礎となるメモリ管理が依然として重要であるということですが、以前は新しいプログラマのためにルールの説明と再説明にかなりの時間を費やしていたのですが、ARCではより高度なトピックになっています。新しい開発者に、根底にあるへの呼び出しで頭を埋めるのではなく、オブジェクトグラフの観点から考えてもらいたいと思いますobjc_retain()
。