134 votes

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

Je suis en train de développer une application pour l'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 des informations sur l'ARC dans iOS 5, et j'ai compris en gros que nous n'aurons plus besoin de libérer et de conserver les objets. Mes questions sont les suivantes :

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

  2. Si je développe une nouvelle application pour iOS 5 à l'aide de l'ARC, devrai-je mettre en place une sorte de contrôle de "rétro-compatibilité" ? c'est-à-dire : devrai-je vérifier la version d'iOS et appeler retain et release en conséquence ? En fait, ARC est-il disponible pour toutes les versions d'iOS ou seulement pour iOS 5 ?

150voto

Henrik P. Hessel Points 22046

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

Oui, mais XCode 4.2 inclut un nouvel outil "Migrate to Objective-C ARC" (dans le menu Edit->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 la 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, comme la libération de ressources non récupérables. Le fait de 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 compilation -fobjc-arc du compilateur. ARC est pris en charge dans Xcode 4.2 pour Mac OS X v10.6 et v10.7 (applications 64 bits) (applications 64 bits) et pour iOS 4 et iOS 5. 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). 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 de la technologie ARC, devrai-je implémenter une une sorte de contrôle de "rétro-compatibilité" ? En d'autres termes, devrai-je vérifier la version d'iOS et appeler retain et release en conséquence ? Donc, en gros, est-ce que l'ARC est-il disponible pour toutes les versions d'iOS ou seulement pour iOS 5 ?

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

Au lieu de devoir vous rappeler quand il faut utiliser retain, release et autorelease, ARC évalue les exigences de durée de vie de vos objets et insère automatiquement l'option automatiquement les appels de méthode appropriés compilation. Le compilateur génère également 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

8voto

Tibidabo Points 10510

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

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

  1. Sélectionnez les fichiers désirés dans Cible/Phases de construction/Compilation des sources dans Xcode.
  2. PRESS ENTER . (le double clic ne sélectionne qu'un seul fichier)
  3. Type -fno-objc-arc
  4. Appuyez sur Entrez ou Terminé

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

7voto

Dylan Gattey Points 1081

D'après ce que je comprends et d'après mon iPhone/iPod fonctionnant respectivement sous iOS 5 et iOS 4.3, tout est automatique. Une application que j'ai commencée pour la version 4.0 et que j'ai "mise à jour" pour qu'elle fonctionne avec Xcode pour iOS 5.0 ne m'a jamais envoyé le moindre avertissement concernant la libération et la conservation, même si elle est présente à chaque dealloc, etc. Cependant, une partie de ce même code que j'ai inséré (en copiant le fichier) dans un nouveau projet créé avec Xcode pour iOS 5 a beaucoup, beaucoup d'avertissements. Il semble donc que vous n'ayez pas à supprimer tous ces appels, et non, il l'adapte en quelque sorte automatiquement pour les anciennes versions. En profilant mon iPod, je ne vois pas de fuites de mémoire ou d'autres signes d'échec de deallocs/releasing. Est-ce que cela peut aider ?

5voto

Yar Points 25421

En ce qui concerne cette partie de votre question

Si je développe une nouvelle application pour iOS 5 en utilisant ARC, devrai-je mettre en place une sorte de vérification de la "rétro-compatibilité" ? En d'autres termes : devrai-je vérifier la version d'iOS et appeler retain et release en conséquence ? Donc, en gros, l'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 en charge la "rétro-compatibilité" (il ADAPTE en fait le code pour faire fonctionner la fonction retain/release, essentiellement), mais si vous ne compilez pas pour iOS 5.0, vous ne pouvez pas utiliser la fonction weak comme mot-clé. Au lieu de cela, vous utilisez assign . C'est malheureux : weak est un avantage considérable (pas de pointeurs pendants, jamais !). Voir ma question ici pour une discussion sur weak , assign et ARC.

2voto

oliver Points 61

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X