web-dev-qa-db-fra.com

Quelques questions sur le comptage automatique des références dans iOS5 SDK

Je développe actuellement une application pour iPad. Le développement a commencé pour iOS 4.2 et se poursuit maintenant (et je pense que cela sera terminé) pour iOS 4.3. Je viens de lire à propos d'ARC dans iOS 5 et, au fond, j'ai compris que nous n'aurons plus jamais besoin de libérer et de conserver des objets. Mes questions sont:

  1. Si je décide de passer à iOS 5, dois-je supprimer tous les [myObject retain] et [myObject release] déclarations de mon code?

  2. Si je développe une nouvelle application pour iOS 5 avec ARC, devrais-je mettre en œuvre une sorte de vérification de "rétro-compatibilité"? i.e .: devrais-je vérifier la version d'iOS et appeler, retenir et relâcher en conséquence? Donc, en gros, ARC est-il disponible pour toutes les versions d'iOS ou seulement pour iOS 5?

134
Luke47

Si je décide de passer à iOS 5, dois-je supprimer toutes les instructions [myObject rétention] et [version de myObject] de mon code?

Oui, mais XCode 4.2 inclut un nouvel outil "Migration vers Objective-C ARC" (dans le menu Edition -> Refactor), qui le fait pour vous. Appeler dealloc est une autre histoire. Comme mentionné dans les commentaires, la référence clang indique que vous devez conserver votre méthode dealloc:

Justification: même si ARC détruit automatiquement les variables d'instance, il existe toujours des raisons légitimes d'écrire une méthode dealloc, telle que la libération de ressources non conservables. Ne pas appeler [super dealloc] avec une telle méthode est presque toujours un bug.

Vous activez ARC en utilisant un nouvel indicateur de compilation -fobjc-arc. ARC est pris en charge dans Xcode 4.2 pour Mac OS X v10.6 et v10.7 (applications 64 bits) et pour iOS 4 et iOS 5. (Les références faibles ne sont pas prises en charge dans Mac OS X v10.6 et iOS 4). Il n'y a pas de support ARC dans Xcode 4.1.

-

Si je développe une nouvelle application pour iOS 5 en utilisant ARC, devrai-je mettre en œuvre une sorte de vérification de "rétro-compatibilité"? Est-ce que je devrai vérifier la version d'iOS et appeler, retenir et relâcher en conséquence? Donc, en gros, ARC est-il disponible pour toutes les versions d'iOS ou juste pour iOS 5?

Non, car ARC fait sa magie au moment de la compilation et non au moment de l'exécution.

Au lieu de devoir vous rappeler quand utiliser rétention, validation et libération automatique, ARC évalue les exigences de durée de vie de vos objets et insère automatiquement les appels de méthode appropriés pour vous au moment de la compilation. Le compilateur génère également des méthodes dealloc appropriées pour vous.

Informations complémentaires sur ARC: http://clang.llvm.org/docs/AutomaticReferenceCounting.html

150
Henrik P. Hessel

Q1: NON, si vous avez un code existant, vous pouvez continuer à l'utiliser tel quel avec le - fno-objc-arc vous pouvez désactiver sélectivement l'ARC sur n'importe quel fichier.

Si vous voulez désactiver l'ARC sur PLUSIEURS fichiers:

  1. Sélectionnez les fichiers souhaités dans Target/Build Phases/Compile Sources in Xcode.
  2. APPUYER SUR ENTREE. (double clic sélectionne un seul fichier)
  3. Type - - fno-objc-arc
  4. Appuyez sur Entrée ou Terminé

Q2: NON, la cible peut être aussi basse que iOS 4.0

8
Tibidabo

Autant que je sache et tant que mon iPhone/iPod sous iOS 5 et iOS 4.3 fonctionnent, tout est automatique. Une application que j'ai lancée pour la version 4.0 et qui a été "mise à jour" pour fonctionner avec Xcode pour iOS 5.0 ne me dit jamais quoi que ce soit à propos de la publication et de la conservation, même si elle est omniprésente dans chaque transaction, etc. Cependant, une partie du même code que j'ai inséré (copié le fichier) dans un nouveau projet créé avec Xcode pour iOS 5 génère de nombreux avertissements. Il semble donc que vous ne devez pas supprimer tous ces appels et non, il l'adapte automatiquement d'une manière ou d'une autre pour les versions antérieures. En profilant mon iPod, je ne vois aucune fuite de mémoire ni aucun autre signe d'échec des deallocs/release. est-ce que cela aide?

7
Dylan Gattey

En ce qui concerne cette partie de votre question

Si je développe une nouvelle application pour iOS 5 avec ARC, devrais-je mettre en œuvre une sorte de vérification de "rétro-compatibilité"? Est-ce que je devrai vérifier la version d'iOS et appeler, retenir et relâcher en conséquence? Donc, en gros, ARC est-il disponible pour toutes les versions d'iOS ou seulement pour iOS 5?

Il convient de noter que le compilateur iOS 5 prend la "rétro-compatibilité" (en réalité, il ajoute le code pour que la conservation/la publication fonctionne, essentiellement), mais si vous ne compilez pas pour iOS 5.0, vous ne pouvez pas utiliser weak en tant que mot clé. Au lieu de cela, vous utilisez assign. C'est malheureux: weak est un énorme avantage (pas de pointeur, jamais!). Voir ma question ici pour une discussion de weak, assign et d'ARC.

5
Dan Rosenstark

Si vous pouvez désactiver ARC en n'utilisant pas le nouvel indicateur de compilation -fobjc-arc, vous n'êtes pas obligé de réécrire le code à l'avenir, je suppose (?)

2
oliver