Le point sur ARC

Après le garbage collector d'Objective-C qui a fait un flop et pour cause... Je me pose la question de l'avenir d'ARC. Réelle amélioration ou nouvel argument commercial destiné aux nouveaux venus?
J'aimerais bien avoir l'opinion de ceux qui l'on déjà mis en oeuvre au jour le jour. Je m'attendais à ce que cela soit relativement transparent mais cela n'a pas l'air aussi simple que ça dans les faits. Je suis preneur de vos opinons.
J'aimerais bien avoir l'opinion de ceux qui l'on déjà mis en oeuvre au jour le jour. Je m'attendais à ce que cela soit relativement transparent mais cela n'a pas l'air aussi simple que ça dans les faits. Je suis preneur de vos opinons.
Mots clés:
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
A mon avis, çà peut attirer les nouveaux venus dans un premier temps car çà rend le code plus "accessible", mais c'est dommage... La compréhension de la gestion mémoire reste, à mon avis, quelque chose de primordial...
Idem
Je ne l'utilise pas en tout cas.
J'imagine même pas si un jour tu vas devoir gérer du C++ ou pire, du C. Tu vas être dans le caca ^^
Pas de risque. On est non violant ici...
Quand je compare ARC au GB, c'est bien évidement de la provocation. J'ai conscience qu'ARC est plus évolué.
D'une part, ARC n'a vraiment rien à voir avec le Garbage Collector, puisque c'est le compilateur qui s'occupe de "deviner" où placer les release, alors que le Garbage Collector s'occupe (corrigez-moi si je me trompe) de faire un nettoyage d'objets non utilisés en temps réel (cà d pendant que l'application tourne). Grosse différence donc... fini les pertes de perfs ainsi que des plantages plus qu'exotiques.
ARC existe car, dixit Apple, "La première cause de plantage d'une application OS X / iOS vient d'un problème au niveau de la gestion mémoire".
ARC, ça a l'air vraiment pas mal et puissant. Mais je le dis et insiste énormément dessus: n'utilisez pas ARC si vous êtes un débutant. Il vous faut absolument maà®triser la gestion mémoire avant de vous attaquer à ARC. ça peut vous paraà®tre stupide dit comme ça, mais utiliser un langage orienté-objet sans même connaà®tre les mécanismes de base de la gestion mémoire ne fera que vous handicaper à un moment ou un autre, même avec ARC activé.
Pour ma part, je ne m'y suis toujours pas mis simplement car je trouve ça assez déroutant.
Intéressant. C'était une grosse limite du GC il me semble.
De toute façon, pour utiliser ARC on est un peu obligé de connaà®tre les bases de la gestion mémoire, ne serait-ce que pour les strong vs weak references.
Dans les faits, si, c'est relativement transparent. Alors que sans ARC il faut réfléchir à la gestion mémoire pratiquement à chaque ligne de code écrite, avec ARC, cela devient une exception, le cas général étant très bien géré par le compilateur.
Les exceptions principales:
C'est à peu près tout. Donc si vous n'utilisez pas le toll-free bridging ni ne castez vos pointeurs dans tous les sens, ARC est indolore et totalement silencieux pour vous.
Il faut bien comprendre que ARC et GC sont fondamentalement différents. Là où GC traque les objets orphelins (c'est à dire les objets qui ne sont plus accessibles par un pointeur) à l'aide d'un runtime complexe qui nécessite l'exécution de code en tâche de fond (thread du GC), ARC se contente de rajouter des appels à retain/release/autorelease au moment de la compilation du code, là où vous les auriez rajoutés si vous aviez géré la mémoire vous même.
Les avantages sont multiples: Pas de runtime supplémentaire, compatibilité totale entre le code ARC et le code non ARC (tant qu'il respecte les conventions de nommage), et, comme le dit Greg Parker (qui est le chef de projet du runtime objective-c chez Apple), le compilateur est meilleur que vous pour placer les appels de gestion mémoire aux endroits optimums.
À vrai dire je n'ai pas de préférences quant à l'usage ou non de l'ARC. L'usage de l'ARC allège le code en tout cas et - parait-il - c'est plus performant (pas fait de test en ce sens).
En même temps je ne me vois pas rejeter toute amélioration qui va dans le bon sens. C'est ainsi que j'ai adopté Storyboard également.
Concernant la simplicité de mise en oeuvre de l'ARC... je ne peux y répondre car je l'utilise sur un nouveau projet (pas de refactoring).
Enfin, peu importe qu'un débutant soit attiré par l'ARC. Celui qui ne veut pas faire d'effort fera toujours un résultat pourri. Avec ou sans ARC.
Quand on utilise pas ARC, tout écart dans la gestion mémoire (oubli de release/retain, release en trop, etc...) est indétectable par le compilateur (oui, je sais, il y a l'analyse syntaxique, mais elle a ses failles), et c'est au développeur de traquer les bugs à l'exécution.
En ce qui me concerne, je n'écrirai plus de code en gérant la mémoire manuellement. ARC le fait très bien et est clairement la solution d'avenir (les avantages du Garbage Collector sans ses inconvénients, avec un investissement minimum)
Mais ça va m'énerver de pas pouvoir mettre des NSLog (ou breakpoint symbolique) sur les dealloc pour vérifier rapidement si mes objets sont bien détruit quand je le veux ^^
Moi j'avais fait bien mieux...
http://www.sam.eliot...oryWatchDog.mov
J'avoue. Derrière ça fonctionne comment ? runtime ?
Toutefois, pendant les formation Mediabox, je force les stagiaires à apprendre la gestion de la mémoire; de mon point de vue, ARC n'est pas magique, et il faut tout de même qu'ils fassent la différence entre un [[NSString alloc] initWithFormat:] et un [NSString stringWithFormat:].
ARC n'interdit pas d'implémenter une méthode dealloc... La seule différence, c'est que l'implémentation de la méthode:
Donc, clairement, rien n'empêche d'implémenter un dealloc qui fait un NSLog.
Oui, j'utilise le runtime pour court-circuiter les appels à init/dealloc/retain/release et les remplacer par mes méthodes de trace. Ensuite, je rappelle ni vu ni connu les méthodes originelles. Certaines applications sur lesquels je travaille doivent fonctionner 24h/24 7J/7 donc hors de question de laisser passer le moindre leak surtout pour les ressources graphiques. Avec un collègue, on a même poussé le vice jusqu'à historiser les piles d'appel et utiliser la commande atos pour remonter jusqu'au code source...
http://sam.eliotis.c...oryWatchDog.mov
Tu as aussi cette catégorie que j'avais présenté il y a pas mal de temps et qui a fait ses preuves...
Surveiller ses dealloc
ah bon et pourquoi pas ?
N'est ce pas là un raccourci dangereux? ARC limite les risques mais ne t'empêche en aucun cas de faire de nombreuses fuites.
Un simple NSTimer est un bon exemple. Instancié par une classe, si le target est la classe elle même, le NSTimer fait un retain sur le target, on se retrouve pas plus avancé avec ARC. Si on invalide pas le timer à un moment donné, la classe l'utilisant ne sera jamais libérée même si on ne l'utilise plus...
Parce que de toute façon cela produit une erreur à la compilation
ARC se charge tout seul de faire le [super dealloc] à la place du développeur.
D'accord, je croyais qu'on devait tout simplement pas l'implémenter. Merci pour l'info.
merci pour l'info
Il y a des règles pour la gestion mémoire sans ARC, il y en a aussi avec l'ARC. Faut juste les adopter, comme tu as pu adopter les retain/release.
Enfin, je ne vois pas en quoi c'est plus important de ne pas utiliser l'ARC sur iphone... là ça m'échappe. Au contraire : Apple annonce des performances jusqu'à 2,5 fois plus rapide que les retain/release. C'est plutôt pas mal pour du code sur iPhone.