Comment fonctionne le nouveau automatique de comptage de référence du mécanisme de travail?
Quelqu'un peut-il brièvement m'expliquer comment l'ARC fonctionne? Je sais que c'est différent de la Collecte des Ordures, mais je me demandais juste exactement comment il a travaillé.
Aussi, si l'ARC n'est que GC n'sans souci de performance, alors pourquoi Java utilisation de GC? Pourquoi ne pas utiliser l'ARC ainsi?
- Cela va vous raconter tout ça: http://clang.llvm.org/docs/AutomaticReferenceCounting.html la Façon dont il est mis en œuvre dans Xcode et iOS 5 est sous NDA.
- Que de mauvais conseils. Je ne voulez pas vous connecter, ou encore avoir un compte pour iOS dev center, mais je suis intéressé à connaître de l'ARC, tout de même.
- L'ARC ne permet pas de faire tout ce que GC n', il vous oblige à travailler avec les forts et faibles de référence sémantique explicite, et les fuites de mémoire si vous n'obtenez pas ceux de droite. Dans mon expérience, c'est au premier abord difficile lorsque vous utilisez des blocs en Objective-C, et même après que vous avez appris des trucs que vous êtes de gauche avec quelques ennuyeux (OMI) du code réutilisable autour de nombreux usages de blocs. Il est plus commode de simplement oublier forts/faibles références. En outre, GC pouvez effectuer un peu mieux que l'ARC wrt. Pour le PROCESSEUR, mais nécessite davantage de mémoire. Il peut être plus rapide que la mémoire explicite de gestion lorsque vous avez beaucoup de mémoire.
- plus de la mémoire". Beaucoup de gens, mais dire que je trouve ça difficile à croire.
- accepté de répondre ici est une bien meilleure réponse à la question de savoir si". L'on a accepté la réponse est le plus souvent fausses.
- Actuellement, je ne me souviens même plus pourquoi j'ai dit que, pour être honnête. 🙂 En attendant, j'ai réalisé qu'il ya donc beaucoup de différents GC stratégies que de telles déclarations générales sont probablement tous sans valeur. Permettez-moi de réciter Hans Boehm de son Allocation de Mémoire Mythes et de Demi-Vérités: "Pourquoi ce domaine est-il donc sujettes à la douteuse folk-sagesses?"
- Supprimé quelques commentaires à partir de 2 ans que les gens donnaient sur mais voici le lien que j'étais, qui je pense est une introduction très utile pour le sujet: developer.apple.com/library/ios/releasenotes/General/...
Vous devez vous connecter pour publier un commentaire.
Chaque nouveau développeur qui vient à l'Objective-C a apprendre les règles rigides de lors de à retenir, la libération et l'autorelease objets. Ces règles précisent même les conventions de nommage qui implique de conserver compter des objets retournés par les méthodes. Gestion de la mémoire en Objective-C devient une seconde nature une fois que vous prenez ces règles de cœur et de les appliquer de façon cohérente, mais même les plus expérimentés de Cacao développeurs de glisser de temps à autre.
Avec le Cliquetis Analyseur Statique, la LLVM les développeurs ont réalisé que ces règles étaient assez fiables qu'ils pourraient construire un outil pour signaler les fuites de mémoire et overreleases dans les chemins que votre code.
Automatique de comptage de référence (ARC) est la prochaine étape logique. Si le compilateur peut reconnaître là où vous devriez être en retenue et en libérant des objets, pourquoi ne pas l'avoir insérer ce code pour vous? Rigide, les tâches répétitives sont les compilateurs et leurs frères sont très à la. L'homme d'oublier des choses et de faire des erreurs, mais les ordinateurs sont beaucoup plus cohérente.
Cependant, ce n'est pas complètement libre à vous de vous soucier de la gestion de la mémoire sur ces plates-formes. Je décris le problème principal à surveiller (conserver cycles) dans ma réponse ici, ce qui peut nécessiter un peu de réflexion de votre part pour marquer des pointeurs faibles. C'est toutefois mineure comparativement à ce que l'on gagne de l'ARC.
Lorsque par rapport au manuel de gestion de la mémoire et de collecte des ordures, l'ARC vous donne le meilleur des deux mondes en supprimant le besoin d'écrire conserver /code de libération, mais de ne pas avoir de l'interruption et en dents de scie profils de mémoire vu dans un de ces ordures de l'environnement. Sur les seuls avantages de collecte des ordures a plus ce sont sa capacité à traiter les conserver cycles et le fait que la propriété de l'atome affectations sont peu coûteux (comme discuté ici). Je sais que je suis le remplacement de tous mon Mac code GC avec ARC implémentations.
Quant à savoir si cela pourrait être étendu à d'autres langues, il semble axés autour de la référence système de comptage en Objective-C., Il pourrait être difficile à appliquer à Java ou d'autres langages, mais je ne connais pas assez le faible niveau du compilateur détails pour faire une déclaration définitive de là. Étant donné que Apple est l'un poussant cet effort dans LLVM, Objective-C sera la première à moins qu'une autre partie s'engage d'importantes ressources de leur propre pour cela.
Le dévoilement de cette choqué les développeurs lors de la WWDC, afin que les gens n'étaient pas conscients que quelque chose comme cela pourrait être fait. Il peut apparaître sur d'autres plates-formes au fil du temps, mais pour l'instant c'est exclusif à LLVM et Objective-C.
ARC est juste jouer le vieux conserver/release (MRC) avec le compilateur de déterminer quand faire appel à conserver/release. Il aura tendance à avoir une plus grande performances, de réduire le pic de l'utilisation de la mémoire, et le rendement est plus prévisible qu'un GC système.
D'autre part, certains types de structure de données ne sont pas possibles avec ARC (ou MRC), tandis que le GC peut les manipuler.
Comme un exemple, si vous avez une classe nommée noeud et le noeud est un NSArray des enfants, et même une référence à ses parents qui "fonctionne" avec le GC. Avec l'ARC (et manuel de comptage de référence en tant que bien), vous avez un problème. Un nœud donné sera référencé à partir de ses enfants et de ses parents.
Comme:
Tout va bien alors que vous êtes à l'aide d'Un (dire par l'intermédiaire d'une variable locale).
Lorsque vous avez fini avec elle (et B1/B2/B3), un GC système finira par décider de regarder tout ce qu'il peut trouver à partir de la pile et les registres du CPU. Il ne trouvera jamais Une,B1,B2,B3, donc il va mettre au point et de recycler la mémoire dans d'autres objets.
Lorsque vous utilisez l'ARC ou de la MRC, et de finir avec Un elle un refcount de 3 (B1, B2, et B3 toute référence), et B1/B2/B3 ont un compte de référence de 1 (Un de NSArray détient une référence pour chaque). Donc, l'ensemble de ces objets restent vivants, même si rien ne pourra jamais les utiliser.
La solution courante est de décider d'une de ces références doit être faible (pas de contribuer au compte de référence). Qui va travailler pour certains modèles d'utilisation, par exemple si vous faites référence B1/B2/B3 uniquement via A. Cependant, dans d'autres modèles, il échoue. Par exemple, si vous parfois s'accrocher B1, et s'attendre à remonter via le parent de pointeur et de trouver A. Avec une référence faible si vous ne tenez sur B1, Un peut (et normalement) s'évaporent, et de prendre B2, et B3 avec elle.
Parfois, ce n'est pas un problème, mais certains très utile et naturel façons de travailler avec des structures complexes de données sont très difficiles à utiliser avec ARC/MRC.
Donc l'ARC cible le même genre de problèmes GC cibles. Cependant ARC travaille sur un ensemble limité de modèles d'utilisation puis GC, donc si vous avez pris un GC de la langue (comme Java) et greffés quelque chose comme l'ARC sur certains programmes ne fonctionne plus (ou au moins générer des tonnes de l'abandon de la mémoire, et peut causer de graves permutation de questions ou de manquer de mémoire ou d'espace de swap).
Vous pouvez aussi dire à l'ARC met une plus grande priorité sur la performance (ou peut-être la prévisibilité) alors que GC met une plus grande priorité sur le fait d'être une solution générique. Comme un résultat GC a de moins en moins prévisibles CPU/mémoire d'exigences, et une baisse de rendement (normalement) que l'ARC, mais qui peut gérer tout type d'utilisation. ARC fonctionnera beaucoup mieux pour beaucoup de communes de nombreux modèles d'utilisation, mais un peu (valide!) les habitudes d'utilisation, il va tomber et mourir.
foo = nil
.Magie
Mais plus précisément de l'ARC fonctionne en faisant exactement ce que vous feriez avec votre code (avec quelques différences mineures). L'ARC est un moment de la compilation, de la technologie, à la différence de GC qui est de l'exécution et aura un impact sur votre négativement les performances. ARC permettra de suivre les références à des objets pour vous et synthétiser les conserver/presse/autorelease méthodes selon les règles normales. En raison de cet ARC peut également libérer des choses dès qu'elles ne sont plus nécessaires, plutôt que de les jeter dans une autorelease pool purement de convention de souci.
Quelques autres améliorations incluent la réinitialisation des références faibles, la copie automatique de blocs pour le segment de mémoire, la vitesse à travers le conseil d'administration (6x pour autorelease piscines!).
Discussion plus détaillée au sujet de la façon dont cela fonctionne est trouvé dans la LLVM Docs sur ARC.
Il varie considérablement à partir de la collecte des ordures. Avez-vous vu que les avertissements vous dire que vous avez peut-être une fuite d'objets sur des lignes différentes? Ces déclarations de même vous dire sur quelle ligne vous avez alloué à l'objet. Cela a été fait un pas de plus et maintenant vous pouvez insérer
retain
/release
déclarations à l'endroit approprié, mieux que la plupart des programmeurs, presque 100% du temps. Il y a parfois d'étranges cas de retenue des objets que vous avez besoin pour l'aider à sortir avec.Très bien expliqué par Apple de la documentation du développeur. Lire "Comment ARC Œuvres"
Savoir Diff. entre la collecte des Ordures et de l'ARC: Lire cette
ARC est un compilateur qui offre gestion automatique de la mémoire des objets.
Au lieu de vous avoir à se rappeler lors de l'utilisation de
retain, release
, etautorelease
, de l'ARC évalue la durée de vie des exigences de vos objets et insère automatiquement en mémoire les appels pour vous au moment de la compilation. Le compilateur génère également approprié dealloc méthodes pour vous.Le compilateur insère le nécessaire
retain/release
appels au moment de la compilation, mais ces appels sont exécutés au moment de l'exécution, comme tout autre code.Le diagramme ci-dessous vous donnent la meilleure compréhension de la façon dont l'ARC fonctionne.
Ceux qui sont nouveaux dans le développement d'iOS et n'ayant pas d'expérience de travail sur l'Objective C.
Veuillez consulter la Pomme de documentation pour Avancé De Gestion De La Mémoire Guide De Programmation pour une meilleure compréhension de la gestion de la mémoire.