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

134

Je développe actuellement une application pour iPad. Le développement a commencé pour iOS 4.2 et se poursuit maintenant (et je pense qu'il sera terminé) pour iOS 4.3. Je viens de lire à propos d'ARC dans iOS 5, et en gros, 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 toutes les instructions [myObject retain]et [myObject release]de mon code?

  2. Si je développe une nouvelle application pour iOS 5 à l'aide d'ARC, aurai-je besoin de mettre en œuvre une sorte de vérification de «rétro-compatibilité»? c'est-à-dire: aurai-je besoin de vérifier la version d'iOS et d'appeler retenir et publier en conséquence? Donc, fondamentalement, ARC est-il disponible pour toutes les versions iOS ou juste pour iOS 5?

Luc47
la source

Réponses:

150

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

Oui, mais XCode 4.2 inclut un nouvel outil "Migrer vers Objective-C ARC" (dans le menu Edition-> Refactoriser), 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:

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

Vous activez ARC à l'aide d'un nouvel indicateur de compilateur -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 à l'aide d'ARC, aurai-je besoin de mettre en œuvre une sorte de vérification de «rétro-compatibilité»? Ie: aurai-je besoin de vérifier la version d'iOS et d'appeler retenir et publier en conséquence? Donc, fondamentalement, ARC est-il disponible pour toutes les versions 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 vous rappeler quand utiliser la conservation, la libération et la 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 l'ARC: http://clang.llvm.org/docs/AutomaticReferenceCounting.html

Henrik P. Hessel
la source
Merci pour ton explication!
Luke47
4
Ce n'est pas correct à 100%. Il existe un commutateur de compilateur qui détermine si ARC est activé ou non. ARC a également besoin d'un support d'exécution, je crois, donc si vous voulez que votre application fonctionne sur iOS 4.x, vous devrez laisser vos retenues et versions et vous assurer que l'ARC est désactivé.
JeremyP
8
@JeremyP - iOS 4.0 est en effet pris en charge en tant que cible pour les applications ARC, il n'est donc pas nécessaire de conserver le code compté manuellement pour traiter cette ancienne plate-forme. iPhone OS 3.x peut-être, mais j'imagine qu'Apple pourrait interrompre le support pour cela en tant que plate-forme cible une fois que la version 5.0 sera livrée, comme ils l'ont fait pour la version 2.x lorsque la version 4.0 est sortie.
Brad Larson
5
@Brad La base d'installation pour iOS4 est déjà supérieure à 95%. Je pense qu'il est préférable de supprimer le support iOS3 de toute façon.
Henrik P. Hessel
2
Vous ne supprimez pas dealloc, vous supprimez simplement tous vos releases et [super dealloc]de celui-ci. Et dans 99,9%, deallocne libère que des objets, donc vous les supprimez. Mais les objets doivent encore effectuer d'autres tâches de nettoyage qui ne le sont pas release(fermeture de fichiers, suppression d'observateurs, etc.).
Stanislav Yaglo
8

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

Si vous souhaitez désactiver ARC sur PLUSIEURS fichiers:

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

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

Tibidabo
la source
7

Pour autant que je sache et pour autant que mon iPhone / iPod sous iOS 5 et iOS 4.3 fonctionnent respectivement, tout est assez automatique. Une application que j'ai lancée pour 4.0 et que j'ai "mise à jour" pour fonctionner avec Xcode pour iOS 5.0 ne jette jamais d'avertissement à ma manière sur la libération et la conservation, même si c'est partout dans chaque dealloc, 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 comporte de très nombreux avertissements. Il semble donc que vous n'ayez pas à supprimer tous ces appels, et non, cela l'adapte automatiquement aux anciennes versions. En profilant mon iPod, je ne vois aucune fuite de mémoire ni aucun autre signe d'échec des deallocs / libération. est-ce que cela aide?

Dylan Gattey
la source
La dernière version bêta m'invite en fait à supprimer tous les appels d'allocation, et c'est à peu près tout. Vous pouvez toujours conserver / libérer mais le système a le dernier mot.
Dylan Gattey
5

Concernant cette partie de votre question

Si je développe une nouvelle application pour iOS 5 à l'aide d'ARC, aurai-je besoin de mettre en œuvre une sorte de vérification de «rétro-compatibilité»? Ie: aurai-je besoin de vérifier la version d'iOS et d'appeler retenir et publier en conséquence? Donc, fondamentalement, ARC est-il disponible pour toutes les versions iOS ou juste pour iOS 5?

Il convient de noter que le compilateur iOS 5 prend la "rétro-compatibilité" (il AJOUTE en fait le code pour faire fonctionner la conservation / la publication, essentiellement), mais si vous ne compilez pas pour iOS 5.0, vous ne pouvez pas utiliser weakcomme mot clé . Au lieu de cela, vous utilisez assign. C'est dommage: weakc'est un énorme avantage (pas de pointeurs suspendus, jamais!). Voir ma question ici pour une discussion sur weak, assignet ARC.

Dan Rosenstark
la source
2

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

oliver
la source