web-dev-qa-db-fra.com

Quels sont les avantages et les inconvénients de l’utilisation d’ARC?

Quels sont les avantages et les inconvénients de l’utilisation du nouveau style de gestion de la mémoire ARC (ARC) dans un projet iOS?

Pouvez-vous choisir de ne pas utiliser ARC lors du développement avec le SDK iOS 5.0?

Recommandez-vous le comptage ARC ou manuel (MRC) pour un nouveau projet?

Une application utilisant ARC pourra-t-elle fonctionner sur des versions de système d'exploitation antérieures à iOS 5.0?

42
senthil.Freelancer

Quels sont les avantages et les inconvénients de l’utilisation du nouveau style de gestion de la mémoire ARC (ARC) dans un projet iOS?

L'exécution d'un programme ARC est presque identique à celle d'un MRC bien écrit. Autrement dit, les différences de comportement sont souvent indétectables car l'ordre des opérations et les performances sont très proches.

Si vous savez déjà comment implémenter des applications OS X ou iOS avec comptage manuel des références (MRC), ARC n'ajoute pas vraiment de fonctionnalité. Il vous permet simplement de supprimer les opérations de comptage des références de vos sources.

Si vous ne voulez pas apprendre le MRC, alors vous voudrez peut-être d'abord essayer ARC. Beaucoup de gens luttent avec, ou essayent d'ignorer les pratiques courantes de la MRC (exemple: j'ai introduit un certain nombre d'objc devs dans l'analyseur statique). Si vous souhaitez éviter ces problèmes, ARC vous permettra de différer votre compréhension. vous ne pouvez pas écrire de programmes objc non triviaux sans comprendre le comptage des références, la durée de vie des objets et leurs relations, qu'il s'agisse de MRC, d'ARC ou de GC. ARC et GC suppriment simplement l’implémentation de vos sources et agissent correctement dans la plupart des cas . Avec ARC et GC, vous aurez toujours besoin de vous guider.

Je n'ai pas mesuré cela, mais il convient de mentionner que compiler les sources ARC prendraient plus de temps et de ressources.

Si le programme que vous développez utilise assez peu le comptage de références (par exemple, une quantité typique de libérations automatiques), le passage à ARC pourrait améliorer réellement les temps d’exécution de votre programme et l’utilisation maximale de la mémoire.

Pouvez-vous choisir de ne pas utiliser ARC lors du développement avec le SDK iOS 5.0?

Oui, en utilisant CLANG_ENABLE_OBJC_ARC. La compatibilité ARC est binaire. Tout ce qui se passe réellement, c’est que le compilateur s’efforce d’introduire automatiquement les opérations de comptage de références appropriées, en fonction des déclarations visibles pour la traduction en cours ( voir ma réponse ici pour savoir pourquoi la visibilité de la traduction est important ). Par conséquent, vous pouvez également l'activer et le désactiver pour certaines sources d'un projet et l'activer pour d'autres.

Le mode mixte (certaines sources MRC et certaines sources ARC) est toutefois assez compliqué et, de manière subtile, notamment en ce qui concerne les implémentations qui peuvent être dupliquées par le compilateur (par exemple, le corps d’une fonction inline peut être incorrect). Ces problèmes de mode mixte seront très difficiles à isoler. Les programmes et sources ObjC++ seront en particulier difficiles à cet égard. De plus, le comportement peut différer en fonction de vos paramètres d'optimisation (à titre d'exemple); un programme qui fonctionne parfaitement dans une version de débogage peut introduire une fuite ou un zombie dans la publication.

Recommandez-vous le comptage ARC ou manuel (MRC) pour un nouveau projet?

Personnellement, je vais rester avec MRC pendant un certain temps. Même si ARC a été testé dans des conditions réelles d'utilisation, il reste probablement un certain nombre de problèmes qui apparaissent dans des scénarios complexes, pour lesquels vous voudrez éviter d'être les premiers à connaître et à déboguer. La récupération de place d'OS X est un exemple de la raison pour laquelle vous pouvez attendre. Par exemple, le commutateur peut changer lorsque des objets sont détruits - vos objets peuvent être détruits plus tôt et ne jamais être placés dans des pools à libération automatique. Cela pourrait aussi changer l'ordre dans lequel les ivars sont libérés, ce qui pourrait avoir des effets secondaires.

J'ai aussi une grande base de code pour laquelle je ne veux pas perdre une semaine en testant cette fonctionnalité pour le moment. Enfin, la compatibilité en amont est toujours importante pour moi.

Une application utilisant ARC pourra-t-elle fonctionner sur des versions de système d'exploitation antérieures à iOS 5.0?

Si vous développez avec MRC, ce sera compatible avec les versions antérieures. Si vous développez avec ARC, ce ne sera pas nécessairement compatible. En fait, il se peut même qu'il ne compile pas sans un peu de travail supplémentaire. La configuration requise pour l'exécution est disponible dans certaines versions antérieures. Voir aussi cette question . Si vous avez besoin d'une compatibilité ascendante, ARC ne sera pas une option pour certaines versions de système d'exploitation.

Enfin, si vous limitiez le choix à GC ou à ARC, je recommanderais ARC.

60
justin

vous pouvez l’activer/désactiver avec CLANG_ENABLE_OBJC_ARC = NO avantage est que vous devez écrire moins de code et que la gestion de la mémoire est plus simple. L'inconvénient est que vous devez supprimer tout ce que vous avez appris sur la gestion de la mémoire :) Je préfère le désactiver.

1
RolandasR

J'utilise Lion et xcode 4.3. J'ai eu le même problème.

Pour résoudre ce problème, j'ai réglé le paramètre "Construire Paramètres-> Objective-C Référence automatique" sur "Non".

Afin de voir qu'il était réglé sur "Oui", je devais également activer les options "Tous" et "Niveaux" de la barre d'outils située juste en dessous de la barre d'outils "Paramètres de construction".

Une fois ces options activées, je pouvais voir que mon projet avait cette option définie sur "Oui". Il m'a fallu un certain temps pour comprendre que le paramètre par défaut était "Non", ce qui est affiché jusqu'à ce que j'active l'option "Niveaux".

0
Michael Potter

Vous pouvez activer ARC avec "Edition-> Refactoriser> Convertir en Arc Objective C", cela va refactoriser entièrement votre code (vous débarrasserez de tous les appels de gestion de la mémoire, etc.). Il n'y a pas d'opération inverse, assurez-vous donc que tout est sous contrôle de source si vous avez des doutes. Cet article vous montre comment le désactiver pour des fichiers spécifiques. Je ne pense pas qu'il y ait trop d'arguments à faire pour ne pas y revenir, mis à part le fait qu'il est difficile de voir tous ces efforts mis en œuvre pour bien gérer la mémoire et que nous devions arrêter de sauter au plafond. chaque fois que nous voyons init, nouveau, copie sans libération correspondante/autorelease (et cela prendra un certain temps pour s’y habituer). Peut-être pourrait-on prétendre que dans certaines circonstances, la gestion manuelle de la mémoire entraîne une nette amélioration des performances/de l'empreinte mémoire. Si tel était le cas, cela m'intéresserait également.

0
jbat100