Objective-C ARC vs. MRR:なぜスイッチ?

私はC#/ Javaのバックグラウンドから来ている新しいココア開発者です。私は客観的な - C言語が使用するメモリ管理パターンに導入されていたので、コードを意識した開発に非常に役立ちます。

なぜAppleは、代わりに、代わりに ARC (Automatic Reference Counting)を使用したいのですか? MRR (マニュアル保持 - リリース)、ARCが提供する時間節約以外の利点は何ですか?

開発者がobj-cエコシステムから得る良い市民の習慣に悪影響を与えるような移行が見られます。

ニック

12
編集に感謝しています。それは私の最初の投稿でした、そして、私は新しい略語をさらに説明するのを忘れました。
追加された 著者 Nicholas Credli,

3 答え

有能な開発者が正しいことを容易にすることは、新しい開発者が学習しにくいという副作用がありますが、おそらく価値があるようです。

ARC はC#やJavaなどのトレースコレクタよりもあまり許されていません。明確なオブジェクト所有権モデルがない場合、ほぼ確実にサイクルを作成し、膨大なメモリを消費します。私が望むことは、これが十分に明らかになったことです(Instrumentsを介して、まだそれを探し出す必要があります。何ができるかわかりません)。新しい開発者は、オブジェクトグラフを素早く非周期的に保つことをすぐに学びます。

12
追加された
@ NicholasE.Credli:これは厳密な目的です:ほとんどのARCルールは、コンパイラが100%正しくなければならないという原則から守られています。したがって、あいまいなケースを投げると、あなたの意味を推測できません単にエラーを投げるだけです。解決策は、単にあなたのコードを明確にすることです。
追加された 著者 Peter Hosey,
ありがとう@Catfish_Man、私はむしろ静的アナライザーでサポートされているコンパイラー警告システムのようなARCを好むでしょう。
追加された 著者 Nicholas Credli,

ARCでは、定型的なdeallocメソッドの代わりに有用なコードを書くことに集中することができます。

私が知っているほとんどの人は、後で release を保存したので、実際に置くことを忘れることができないので、 alloc の後ろに autorelease 。そのため、オブジェクトはオートレリープールが排水され、ARCを使用してもはや不要になったときにオブジェクトの割り当てを解除します。私はそのような場合、ARCでコンパイルされたプログラムでもメモリ使用量は少なくなると思います。

そして、私には恥ずかしい、それは私のアプリケーションがあまりにも頻繁にクラッシュするようにするのに役立ちます。
10.000の起動ごとに発生する早すぎるリリース。私が完全に追跡することができなかったものは、うまくいけばARCとこれは過去のものです。


開発者がobj-cエコシステムから得る良い市民の習慣に悪影響を与えるような変化が見られます。

アセンブラで始まった組み込み開発者は、おそらく同じ方法で、Cで始まってアセンブラを使用したことのない人が悪い習慣に陥ると思うでしょう。

私の意見では、MRRとARCの議論は似ています。
ARCとCはどちらも、より短い時間でよりメンテナンス可能なコードを書くことを可能にします。 そして両方とも、より大きなメモリとCPUの占有面積につながる可能性があります。
私が正しく覚えていれば、Appleは、CPU使用率への影響を補うために、保持 release そしてそのため、MMRが依然として存在している実際の理由はありません。

私は、新しいARCの大将を歓迎します。

9
追加された

私は実際にはARCへの移動を楽しんでいました。その上に、私は新入者がしばしば命名規則の意義(+ alloc、-copyなど対[NSString stringWith ....])によって踏まれてしまうと思う。あなたが何を所有しているかだけ心に留めておかなければならないCoreFoundationなど(C APIs)を扱うときは、厄介な唯一のビットです。

2
追加された