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

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级讲师

répondre à tous(4)
PHPzhong

ARC et MRC sont en fait les méthodes originales de gestion de la mémoire, appliquez : alloc ; release : release De cette façon, l'application et la libération de mémoire doivent être calculées avec précision, pour les programmes plus complexes. , calculer le moment où l'objet d'application doit être publié est un peu déroutant. Ainsi est apparue la méthode de comptage de références Reference Counting, qui permet de compter l'utilisation des objets afin de déterminer si l'objet doit être libéré.
MRC est Mannul Reference Counting, ce qui nécessite un calcul manuel de l'utilisation de l'objet. Autrement dit, chaque fois qu'un objet est utilisé, le nombre de références doit être manuellement retain incrémenté de un, et il doit être Diminuez le nombre de références de un. Si vous écrivez comme ça pendant longtemps, cela vous semblera très gênant pour écrire release et retain, il y a donc un comptage automatique des références de release. simple, qui consiste à déduire ARC et retain à travers le programme. Là où release doit apparaître, écrivez retain et release à la place.
et AutoRelease sont un ensemble d'idées complètement différent, un peu comme le mécanisme de nettoyage des déchets Java dans GC Il ne sera pas utilisé lorsque l'objet n'est plus utilisé comme ARC ou MRC. être libéré immédiatement, mais attendez une occasion de le libérer. Aujourd'hui, lorsque ARC est plus mature, il n'y a pas beaucoup d'occasions de l'utiliser. Cependant, dans certains scénarios particuliers, AutoRelease peut encore obtenir des effets que ARC ne peut pas.

伊谢尔伦

Vous l'avez expliqué très clairement. ARC ne peut pas dire qu'il n'y a pas du tout besoin de considérer la gestion de la mémoire, mais c'est effectivement très complet. Le pool de mémoire est l'endroit où vous stockez la mémoire pour laquelle vous postulez. C'est facile à comprendre. Je me souviens que dans le cas d'ARC, il semble que la mémoire qui devait auparavant être libérée manuellement puisse être directement placée dans le pool de versions, et le système libérera automatiquement la mémoire dans le pool de versions. Le MRC est ce que vous avez dit, le principe de libération basé sur qui postule. En parlant de ça, j'aime toujours MRC, j'ai l'impression d'avoir beaucoup de pouvoir.

黄舟

Si on veut parler d'histoire, oc est MRC depuis son lancement, et AutoRelease est une fonctionnalité de la 2.0. Mais je ne sais pas si la libération automatique est également liée à runloop. Je sais que runloop est utilisé dans la fonction principale. Puis-je le résoudre ?

漂亮男人
  1. MRC Au début, les programmeurs géraient la mémoire manuellement.

  2. ARC était autrefois le projet "Clang static analyseur", qui était utilisé pour analyser le code Objective-C afin de détecter des erreurs telles que des fuites de mémoire et une libération prématurée. L'effet était si bon qu'Apple a envisagé d'utiliser cet analyseur automatiquement. insère toutes les conservations et versions, ce qui a finalement conduit à la création d'ARC.

  3. L'Autorelease Pool devrait être quelque chose en même temps que MRC et n'a rien à voir avec ARC. Les scénarios d'utilisation courants sont les suivants : une méthode doit renvoyer un objet nouvellement créé, mais vous ne souhaitez pas le conserver et vous vous inquiétez d'une publication anticipée. Vous envoyez donc un message de libération automatique afin que le pool de libération automatique devienne son propriétaire temporaire et le fasse. ne pas être libéré plus tôt lors de la vidange. Ce décompte temporaire est également soustrait.

Le nom du pool de libération automatique peut donc être un peu trompeur. Le pool de libération automatique ne libère rien "automatiquement". Ce qu'il libère est ce que vous lui avez demandé de publier auparavant.

Pour résumer : MRC est l'endroit où les programmeurs écrivent Retain et Release pour gérer la mémoire. Le mécanisme de pool de libération automatique est utilisé pour résoudre certains problèmes difficiles de propriété d'objets. ARC sauve tout le monde du feu et de l'eau.


  • Le résultat de l'exécution d'ARC est que le code après conservation et publication est automatiquement ajouté, ce qui n'est pas différent de ce que vous avez écrit dans MRC, mais il est moins sujet aux erreurs. En d'autres termes, le mécanisme ARC est complètement différent du garbage collection de Java. ARC est un mécanisme de compilation et non d'exécution.

  • Lorsque vous utilisez ARC, vous devez toujours faire attention aux problèmes de mémoire, tels que les références circulaires fortes qui se produisent facilement lors de l'utilisation de blocs. ARC ne peut pas vous aider avec ce genre de problème. C'est relativement basique et devrait le faire. être couvert dans n’importe quel livre Objective-C.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal