1. Il existe trois méthodes de gestion de la mémoire iOS : ARC, MRC et pool de mémoire.
2.MRC : Suivez le principe de qui postule, qui ajoute, qui libère. Les ajouts et modifications apportés à la technologie de mémoire nécessitent une manipulation manuelle. Depuis iOS en 2012, il a été progressivement remplacé par le mode ARC (comptage automatique de la mémoire).
3.ARC remplace MRC Lors de la phase de compilation de l'application, Xcode ajoute du code de gestion de la mémoire.
4. Pool de libération de mémoire Release Pool : placez la mémoire qui doit être libérée dans un pool. Lorsque le pool est vidé, tout l'espace mémoire du pool sera automatiquement libéré. L'opération de libération du pool de mémoire est divisée en automatique et manuelle. La libération automatique est affectée par le mécanisme runloop.
5. Le pool de mémoire est-il une technologie de MRC ? Il existe un comptage automatique de la mémoire en mode ARC et un traitement manuel de la mémoire en MRC. Le pool de mémoire est-il donc une autre méthode de traitement de comptage de mémoire sous MRC par rapport à la méthode de libération ?
6. Je n'arrive pas à comprendre la relation entre ARC, MRC et le pool de mémoire.
7. La sémantique d'ARC est que dans le développement réel, il n'y a pas du tout besoin de s'inquiéter des problèmes de gestion de la mémoire. (Vraiment ?)
ARC
etMRC
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érencesReference Counting
, qui permet de compter l'utilisation des objets afin de déterminer si l'objet doit être libéré.MRC
estMannul 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 manuellementretain
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 écrirerelease
etretain
, il y a donc un comptage automatique des références derelease
. simple, qui consiste à déduireARC
etretain
à travers le programme. Là oùrelease
doit apparaître, écrivezretain
etrelease
à la place.et
AutoRelease
sont un ensemble d'idées complètement différent, un peu comme le mécanisme de nettoyage des déchetsJava
dansGC
Il ne sera pas utilisé lorsque l'objet n'est plus utilisé commeARC
ouMRC
. être libéré immédiatement, mais attendez une occasion de le libérer. Aujourd'hui, lorsqueARC
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 queARC
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 ?
MRC Au début, les programmeurs géraient la mémoire manuellement.
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.
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.