Avec le nouveau comptage automatique de références (ARC) introduit dans Xcode 4.2, nous n'avons plus besoin de gérer manuellement la conservation/libération dans Objective-C.
Cela semble similaire à la récupération de place, comme dans Objective-C sur Mac et dans d'autres langues. En quoi l'ARC diffère-t-il de la collecte des ordures?
Comme je le décris dans ma réponse ici , ARC peut fournir le meilleur de la gestion manuelle de la mémoire et du traçage de la récupération de place. Il supprime principalement la nécessité pour un développeur de suivre les conservations, les versions et les libérations automatiques manuelles sur les objets Objective-C, tout en évitant la nécessité d'un processus de ramasse-miettes qui peut utiliser des ressources limitées sur un appareil mobile et provoquer des bégaiements occasionnels dans une application en cours d'exécution .
ARC insère les conserves et versions appropriées requises pour le comptage des références au moment de la compilation, en appliquant les règles que tous les développeurs Objective-C ont dû utiliser au fil des ans. Cela évite au développeur d'avoir à gérer cela lui-même. Étant donné que la conservation et la libération sont insérées au moment de la compilation, aucun processus de collecteur n'est nécessaire pour balayer continuellement la mémoire et supprimer les objets non référencés.
Un léger avantage du traçage de la récupération de place sur ARC est que ARC ne traitera pas des cycles de conservation pour vous , où le suivi de la récupération de place peut les récupérer.
Une grande lecture sur le sujet vient de ce fil sur la liste de diffusion Objective-C d'Apple , où Chris Lattner a ceci à dire:
Le principal avantage du GC par rapport à l'ARC est qu'il recueille les cycles de rétention. Un avantage secondaire est que les affectations "retenues" sont "atomiques" car elles sont un simple magasin. ARC a plusieurs gros avantages par rapport à libauto GC:
- Il a une récupération déterministe d'objets (lorsque la dernière référence forte à l'objet disparaît) où GC libère un objet "quelque temps plus tard". Cela définit une classe de bogues subtils qui peuvent exister dans les applications GC qui ne sont pas exposées parce que le collecteur ne se déclenche pas "dans la fenêtre du buggy".
- La ligne des hautes eaux est généralement beaucoup plus basse avec ARC qu'avec GC car les objets sont libérés plus tôt.
- libauto fournit un modèle de programmation fragile, il faut faire attention à ne pas perdre les barrières d'écriture etc.
- tous les cadres du système ne sont pas propres au GC, et les cadres régressent parfois à mesure qu'ils évoluent.
- L'ARC ne souffre pas de fausses racines. libauto scanne la pile de façon conservatrice, ce qui signifie que les entiers qui ressemblent à des pointeurs peuvent rooter des graphiques d'objets.
- ARC n'a rien qui se déclenche et arrête votre application, provoquant des bégaiements de l'interface utilisateur. libauto est assez avancé en ce qui concerne les implémentations GC car il n'arrête pas immédiatement tous les threads, mais il finit généralement par arrêter tous les threads de l'interface utilisateur.
Je migre actuellement mes projets gérés manuellement en mémoire, ainsi que ceux utilisant le ramasse-miettes Objective-C, vers ARC. Après avoir utilisé la récupération de place dans quelques applications Mac pendant un certain temps maintenant, je vois des avantages importants à déplacer ces projets vers ARC.
ARC s'appuie sur un temps de compilation des objets "référencés" qui le rendent efficace dans des environnements en mode basse consommation (appareils mobiles).
GC s'appuient sur des objets "accessibles" basés sur le runtime qui le rendent efficace dans un environnement multi-thread.
ARC injecte un code dans l'exécutable à exécuter "automatiquement" sur les objets inutilisés en fonction de leur nombre de références.
GC fonctionne dans le runtime car il détectera les graphiques d'objets inutilisés (éliminera les cycles de rétention) et les supprimera sur des intervalles de temps indéterminés
En quoi l'ARC diffère-t-il de la collecte des ordures?
ARC est une forme de collecte des ordures.
Vous voulez probablement dire "quelle est la différence entre ARC et le traçage de la récupération de place (comme la JVM et .NET)?". Les principales différences sont que l'ARC est plus lent et fuit des cycles. C'est pourquoi la JVM et le .NET utilisent tous deux des collecteurs de place de traçage. Pour plus d'informations, veuillez lire Comment le comptage des références et le traçage du ramasse-miettes se comparent-ils? .