objective-c - iOS内存管理【ARC、MRC、内存池】三者的关系?
PHP中文网
PHP中文网 2017-05-02 09:25:59
0
4
808

1.iOS内存管理有三种方法:ARC、MRC、内存池。
2.MRC:遵循谁申请、谁添加、谁释放的原则。需要手动处理内存技术的增加和修改。从12年iOS开始开始,逐步被ARC(自动内存计数)模式取代。
3.ARC就是取代了MRC,在App编译阶段,由Xcode添加了内存管理的代码。
4.内存释放池Release Pool:把需要释放的内存统一放在一个池子中,当池子被抽干后(drain),池子中所有的内存空间也被自动释放掉。 内存池的释放操作分为自动和手动。自动释放受runloop机制影响。

5.内存池是属于MRC的技术吗?ARC模式下有自动内存计数了,MRC下有手动内存处理了。那么内存池是MRC下的相对于release 方法的另一种内存计数处理方法吗?

6.我是搞不清ARC、MRC、内存池 三者的关系。

7.ARC的语义就是在实际开发中,根本不用操心内存管理问题。(是吗?)

PHP中文网
PHP中文网

认证0级讲师

全員に返信(4)
PHPzhong

ARCMRC其实都是原始的内存管理方式,申请:alloc;释放:release,这种方式下内存的申请和释放都需要精确计算,对于比较复杂的程序,计算申请对象应该何时被释放是有些头昏脑热的事情。于是就出现了引用计数Reference Counting这种方式,用来统计对象的使用情况以得到对象应不应该被释放。
MRC就是Mannul Reference Counting,它需要手动进行对象使用的计算,也就是每次使用对象时,要手动的retain一下给引用计数加一,而不再使用时还要release一下给引用计数减一。这样写久了,会感觉特别麻烦,要费老大劲去写retainrelease,于是乎就有了ARC自动引用计数,原理也很简单,就是通过程序去推断retainrelease应该出现的位置,代替我们去写retainrelease
AutoRelease则又是完全不同的一套思路,有点儿像Java中的GC垃圾清理机制,它不会像ARC或者MRC那样在对象不再会被使用时马上被释放,而是等到一个时机去释放它。在ARC比较成熟的今天,用到的机会已经不多了,不过再一些特殊的场景下,AutoRelease还是能达到ARCでは達成できない効果。

いいねを押す +0
伊谢尔伦

非常にわかりやすく説明していただきました。ARC はメモリ管理をまったく考慮する必要がないとは言えませんが、確かに非常に完成度が高いです。メモリ プールは、申請したメモリを保存する場所です。これは理解しやすいです。 ARCの場合、今まで手動で解放する必要があったメモリを直接解放プールに入れることができ、システムが自動的に解放プール内のメモリを解放してくれるようだった記憶があります。 MRCというのは、おっしゃるとおり、申請者に基づく釈放の原則です。そういえばMRCは今でも好きです、すごいパワーを持っている気がします。

いいねを押す +0
黄舟

歴史について話したい場合、oc は発売以来 MRC であり、AutoRelease は 2.0 の機能です。しかし、autorelease が runloop に関連していることはわかりません。 runloop が main 関数で使用されることは知っていますが、解決できますか?

いいねを押す +0
漂亮男人
  1. MRC 初期の頃、プログラマーはメモリを手動で管理していました。

  2. ARC は、以前は「Clang static Analyzer」プロジェクトで、メモリ リークや早期リリースなどのエラーを見つけるために Objective-C コードを分析するために使用されていましたが、その効果が非常に優れていたため、Apple は単純にこれを使用することを検討しました。アナライザーは、すべての保持とリリースを自動的に挿入し、最終的に ARC の作成につながりました。

  3. Autorelease Pool は MRC と同時期のものであるはずであり、ARC とは何の関係もありません。一般的な使用シナリオは次のとおりです。メソッドは新しく作成されたオブジェクトを返す必要がありますが、それを保持したくなく、早期リリースが心配なため、自動解放メッセージを送信して、自動解放プールがその一時的な所有者になり、早期に解放されない場合、この一時的なカウントも減算されます。

そのため、自動リリース プールの名前は少し誤解を招く可能性があります。自動リリース プールは、以前にリリースするように指示したものを「自動的に」リリースするわけではありません。

要約すると、MRC は、プログラマーがメモリを管理するために保持と解放を記述する場所であり、自動解放プール メカニズムは、オブジェクト所有権に関するいくつかの困難な問題を解決するために使用されます。


  • ARCの実行結果は、retainとrelease後のコードが自動的に追加され、MRCで書いたものと変わりませんが、エラーが少なくなります。つまり、ARC メカニズムは Java のガベージ コレクションとはまったく異なり、実行時メカニズムではなくコンパイル時メカニズムです。

  • ブロックを使用するときに発生しやすい強参照サイクルなど、ARCを使用する場合は、この種の問題にはまだ注意する必要があります。 Objective-C の本を見つけてください。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!