ARC, ça vaut le coup ou pas?

Quand je suis passé en Objective C (iOS) en C ++ (et en Java), j'avais du mal à comprendre la memory management dans iOS. Mais maintenant tout cela semble naturel et je sais retenir, autorelease, copyr et libérer des trucs. Après avoir lu au sujet de l'ARC, je me request s'il y a plus d'avantages à utiliser ARC ou si c'est juste que vous n'avez pas à vous soucier de la memory management. Avant de passer à l'ARC, je voulais savoir comment la valeur passait à l'ARC.

  1. XCode a le menu "Convertir en Objective C ARC". Est-ce que la conversion est aussi simple (rien à craindre)?
  2. Est-ce que cela m'aide à réduire la memory de mes applications, les memory leaks, etc. (en quelque sorte?)
  3. At-il beaucoup d'impact sur mes applications?
  4. Quels sont les avantages non évidents?
  5. Y a-t-il un inconvénient à y aller?

Voici mon sharepoint vue spécifique sur ARC:

1) XCode a le menu "Convertir en Objective C ARC". Est-ce que la conversion est aussi simple (rien à craindre)?

C'est simple. Ça marche. Utilise le. Comme Kevin Low le fait remarquer, vous devrez passer en revue et corriger les bits où vous utilisez des objects de base de base. Cela exigera juste une __bridge saine de __bridge ou de __bridge_transfer cependant.

2) Est-ce que cela m'aide à réduire la memory de mes applications, les traces de memory, les memory leaks, etc. (en quelque sorte?)

Non, pas vraiment. OK, en quelque sorte. Cela aidera à réduire les memory leaks là où vous avez mal codé précédemment. Cela ne réduit pas l'empreinte memory.

3) At-il beaucoup d'impact sur mes applications?

Pas du tout.

4) Quels sont les avantages non évidents?

L'avenir. Il y aura plus à venir sur le bonus que le compilateur prend une connaissance complexe de la façon dont les objects sont comptés. Par exemple, ARC fournit déjà la belle optimization objc_retainAutoreleasedReturnValue , ce qui est très agréable.

5) Y a-t-il un désavantage à y aller?

Pas du tout.

Veuillez me croire sur parole et commencer à utiliser ARC. Il n'y a aucune raison (IMO) de ne pas le faire, donc les avantages dépassent définitivement les inconvénients!

Pour un examen approfondi de la façon dont ARC fonctionne pour peut-être vous aider à vous convaincre que c'est bien, veuillez jeter un coup d'œil à mes articles de blog intitulés «Un regard sous le capot d'ARC» – ici , ici , ici et ici .

Voici ce que vous devez vraiment savoir sur ARC:

Le compilateur comprend mieux Objective-C et Cocoa que vous. Je ne dis pas cela comme une insulte; il le comprend mieux que moi. Je pense que vous pourriez dire qu'il comprend mieux les règles que tout, mais peut-être une douzaine de personnes dans le monde entier. Et il connaît des astuces pour les utiliser à un degré que vous et moi ne pouvons pas répéter, même si nous comprenons aussi bien que lui.

Le rest est juste des détails:

  • Vous allez écrire beaucoup less de code ennuyeux. Code si ennuyeux qu'il est facile de faire des erreurs.
  • En tant que process de compilation et de time de compilation, il a access à des astuces que vous n'avez pas.
    • Il est préférable d'écrire le code de memory management que vous pouvez, même si vous écrivez le code de memory management parfaite théorique.
    • Cela réduira (quelque peu) l'utilisation de la memory «marée haute» sans aucun effort de votre part.
    • Avec la mise à zéro des references faibles, il est beaucoup plus facile d'éviter les plantages provoqués par les pointeurs pendants.
  • Si vous démarrez une nouvelle application, arrêtez d'y penser et utilisez-la.
  • Si vous avez une application existante:
    • Vous devrez le tester à nouveau. Vous devez vous assurer que vous n'avez pas de references circulaires.
    • Si vous avez une application existante qui cible iOS avant iOS 5, la mise à zéro des references faibles n'est pas prise en charge. Vous devriez sérieusement envisager d'exiger iOS 5.
    • Si vous avez une application existante qui cible iOS avant iOS 4, vous ne pouvez pas l'utiliser du tout. A quoi penses-tu, en supportant la merde ce vieux?!?
  • Dans la dernière version de Xcode, ce n'était pas entièrement sans bug. Ce n'est probablement toujours pas le cas. Mais ça vaut toujours la peine d'utiliser.
  1. Si vous utilisez Core Foundation ou un code non-Objective-C, ce n'est pas aussi simple que de passer manuellement votre code et de vous assurer que toutes les conversions entre Objective-C et Core Foundation sont comblées (si vous en avez moules). Vous devrez également gérer la memory pour le code non-Objective-C.

  2. Il est censé s'occuper essentiellement de toutes les memory leaks pour vous, car il automatise la conservation, la libération, la copy, etc. Jusqu'à présent, je n'ai jamais eu de fuite d'Objective-C depuis le passage à ARC.

  3. Non. La construction peut prendre un peu plus de time car elle doit parcourir tout votre code et insert tous les codes de retenue et de libération.

  4. Je ne sais pas s'il y en a. En fin de count, tout ARC est, est un automateur.

  5. Vous aurez à apprendre sur les moulages pontés ainsi que vous ne pouvez pas build pour rien de less que iOS 4.

En fin de count, ça vaut vraiment le coup. J'étais sceptique au début, mais après avoir regardé la video WWDC où ils expliquent comment cela fonctionne, je l'ai aimé de plus en plus.

Avez-vous lu la documentation d'Apple sur ARC ? Cela répond à beaucoup de questions que vous posez.

Basé sur mon expérience, voici ce que je pense:

  1. Oui, c'est simple. Cependant, vous devez absolument tester votre application après la conversion.
  2. Cela peut aider à réduire l'utilisation et les memory leaks de votre application, mais cela n'est pas garanti.
  3. Oui. Vous aurez envie de tester après la conversion en ARC.
  4. Vous n'avez pas à perdre autant de time à réfléchir et à repérer les fuites. Vous pouvez consacrer plus de time et d'énergie au code réel de votre application, plutôt que de vous soucier de conserver / libérer. Même si le code de conservation / libération est naturel et facile pour vous, vous n'êtes pas infaillible et vous oubliez parfois de sortir quelque chose. ARC n'oublie pas.
  5. Si vous prenez en charge iOS 4, vous devrez gérer les references faibles, car ARC ne les prend pas en charge dans iOS 4.

3) Vous devriez re-tester vos applications, mais selon mon expérience, cela fonctionnera à peu près. Regardez très attentivement tous les avertissements du compilateur !!!

4) Avantages non évidents: il est vraiment plus rapide de coder quand vous n'avez pas à penser à la memory management. C'est peut-être évident, mais le montant que cela m'a aidé m'a quand même surpris.

5) Inconvénients: Vraiment le seul inconvénient est d'avoir à désactiver ARC pour certaines bibliothèques tierces.

L'ARC a été si utile que je ne vais tout simplement plus coder sans elle. Il n'y a aucune raison d'avoir à faire face à tout cela et cela fonctionne assez bien dans la pratique.

Regardez la video WWDC sur ARC: https://developer.apple.com/videos/wwdc/2011/?id=323

La position officielle d'Apple dans cette video est que toutes les applications qui peuvent utiliser ARC devraient utiliser ARC. La video va dans pourquoi, et est un excellent aperçu de la technologie, donc je ne vais pas tout répéter ici.

J'ai découvert: ARC rend votre code beaucoup plus rapidement. Dans la video WWDC d'Apple, ils disent que quelques cycles de CPU sont enregistrés pour les methods de conservation et de libération de chaque object NSObject. C'est parce qu'il n'est plus nécessaire de le vérifier au moment de l'exécution (il est maintenant sous-traité au compilateur). Il s'agit d'environ 6 cycles de CPU pour chacun conserver. Si vous utilisez une boucle qui crée beaucoup d'objects, vous pouvez vraiment sentir la différence.

ARC non seulement rend le code plus rapide, mais vous écrivez less de code, ce qui accélère considérablement votre process de développement. Et last but not least, vous ne devez pas searchr des memoryleaks d'environ 90% de votre code. Si vous n'utilisez pas beaucoup de choses de bas niveau, qui doivent utiliser "__bridge jets", vous êtes complètement à court de memory leaks.

Conclusion: Si vous pouvez le faire, FAITES-LE!