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的语义就是在实际开发中,根本不用操心内存管理问题。(是吗?)
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.