1. iOS のメモリ管理には ARC、MRC、メモリ プールの 3 つの方法があります。
2.MRC: 誰が適用し、誰が追加し、誰が解放するかの原則に従います。メモリ テクノロジの追加や変更には手動での処理が必要です。 2012 年の iOS から、徐々に ARC (自動メモリ カウンティング) モードに置き換えられました。
3.ARC は MRC を置き換えます。アプリのコンパイル段階で、Xcode はメモリ管理コードを追加します。
4. メモリ解放プール 解放プール: 解放する必要があるメモリをプールに置き、プールが空になると、プール内のすべてのメモリ領域が自動的に解放されます。 メモリプールの解放操作は自動と手動に分かれます。自動リリースはランループ機構の影響を受けます。
5. メモリプールは MRC のテクノロジーですか? ARC モードでは自動メモリ カウントがあり、MRC では手動メモリ処理があります。では、メモリプールは、解放方式と比較してMRCの下で別のメモリカウント処理方式なのでしょうか?
6. ARC、MRC、メモリプールの関係がわかりません。
7. ARC のセマンティクスでは、実際の開発ではメモリ管理の問題をまったく心配する必要がありません。 (本当ですか?)
PHPz2017-05-02 09:27:59
ARC
和MRC
其实都是原始的内存管理方式,申请:alloc
;释放:release
,这种方式下内存的申请和释放都需要精确计算,对于比较复杂的程序,计算申请对象应该何时被释放是有些头昏脑热的事情。于是就出现了引用计数Reference Counting
这种方式,用来统计对象的使用情况以得到对象应不应该被释放。MRC
就是Mannul Reference Counting
,它需要手动进行对象使用的计算,也就是每次使用对象时,要手动的retain
一下给引用计数加一,而不再使用时还要release
一下给引用计数减一。这样写久了,会感觉特别麻烦,要费老大劲去写retain
和release
,于是乎就有了ARC
自动引用计数,原理也很简单,就是通过程序去推断retain
和release
应该出现的位置,代替我们去写retain
和release
。
而AutoRelease
则又是完全不同的一套思路,有点儿像Java
中的GC
垃圾清理机制,它不会像ARC
或者MRC
那样在对象不再会被使用时马上被释放,而是等到一个时机去释放它。在ARC
比较成熟的今天,用到的机会已经不多了,不过再一些特殊的场景下,AutoRelease
还是能达到ARC
では達成できない効果。
伊谢尔伦2017-05-02 09:27:59
非常にわかりやすく説明していただきました。ARC はメモリ管理をまったく考慮する必要がないとは言えませんが、確かに非常に完成度が高いです。メモリ プールは、申請したメモリを保存する場所です。これは理解しやすいです。 ARCの場合、今まで手動で解放する必要があったメモリを直接解放プールに入れることができ、システムが自動的に解放プール内のメモリを解放してくれるようだった記憶があります。 MRCというのは、おっしゃるとおり、申請者に基づく釈放の原則です。そういえばMRCは今でも好きです、すごいパワーを持っている気がします。
黄舟2017-05-02 09:27:59
歴史について話したい場合、oc は発売以来 MRC であり、AutoRelease は 2.0 の機能です。しかし、autorelease が runloop に関連していることはわかりません。 runloop が main 関数で使用されることは知っていますが、解決できますか?
漂亮男人2017-05-02 09:27:59
MRC 初期の頃、プログラマーはメモリを手動で管理していました。
ARC は、以前は「Clang static Analyzer」プロジェクトで、メモリ リークや早期リリースなどのエラーを見つけるために Objective-C コードを分析するために使用されていましたが、その効果が非常に優れていたため、Apple は単純にこれを使用することを検討しました。アナライザーは、すべての保持とリリースを自動的に挿入し、最終的に ARC の作成につながりました。
Autorelease Pool は MRC と同時期のものであるはずであり、ARC とは何の関係もありません。一般的な使用シナリオは次のとおりです。メソッドは新しく作成されたオブジェクトを返す必要がありますが、それを保持したくなく、早期リリースが心配なため、自動解放メッセージを送信して、自動解放プールがその一時的な所有者になり、早期に解放されない場合、この一時的なカウントも減算されます。
そのため、自動リリース プールの名前は少し誤解を招く可能性があります。自動リリース プールは、以前にリリースするように指示したものを「自動的に」リリースするわけではありません。
要約すると、MRC は、プログラマーがメモリを管理するために保持と解放を記述する場所であり、自動解放プール メカニズムは、オブジェクト所有権に関するいくつかの困難な問題を解決するために使用されます。
ARCの実行結果は、retainとrelease後のコードが自動的に追加され、MRCで書いたものと変わりませんが、エラーが少なくなります。つまり、ARC メカニズムは Java のガベージ コレクションとはまったく異なり、実行時メカニズムではなくコンパイル時メカニズムです。
ブロックを使用するときに発生しやすい強参照サイクルなど、ARCを使用する場合は、この種の問題にはまだ注意する必要があります。 Objective-C の本を見つけてください。