Meilleures pratiques iOS 5 (publier / conserver?)


109

En tant que programmeur iPhone débutant, quelle est la meilleure pratique pour écrire des applications à utiliser avec iOS 5 ou des versions antérieures? Plus précisément, dois-je continuer à utiliser la libération / conservation des données, ou dois-je ignorer cela? Est-ce que ça importe?


1
Utilisez ARC et suivez les meilleures pratiques décrites ici: amattn.com/2011/12/07/arc_best_practices.html Si vous faites cela, vous constaterez que l'ARC "fonctionne". Si vous ne suivez pas ces pratiques, vous vous retrouverez avec des fuites et passerez beaucoup de temps à les dépister ....
n13

Réponses:


98

C'est à vous. Vous pouvez écrire des applications à l'aide de l'ARC (comptage automatique des références), et Xcode écrira un «code de colle» pour permettre à vos applications compatibles ARC de fonctionner sur iOS 4, aucune modification requise. Cependant, certaines choses ne fonctionneront pas, et surtout de nombreuses bibliothèques que vous souhaiterez peut-être utiliser généreront (parfois) d'innombrables erreurs et vous ne pourrez pas les utiliser jusqu'à ce que les développeurs publient une mise à jour compatible avec ARC.


Edit : J'ai récemment découvert que vous pouvez désactiver ARC sur une base par fichier. Voir la réponse de pixelfreak . Donc, mon conseil tient toujours, mais maintenant les bibliothèques tierces ne devraient pas avoir besoin d'être mises à jour pour fonctionner avec ARC.

Voici ce que dit Apple sur la désactivation de l'ARC pour des fichiers spécifiques:

Lorsque vous migrez un projet pour utiliser ARC, l'indicateur de compilateur -fobjc-arc est défini par défaut pour tous les fichiers source Objective-C. Vous pouvez désactiver ARC pour une classe spécifique à l'aide de l'indicateur de compilateur -fno-objc-arc pour cette classe. Dans Xcode, dans l'onglet Phases de construction cible, ouvrez le groupe Sources de compilation pour révéler la liste des fichiers source. Double-cliquez sur le fichier pour lequel vous souhaitez définir l'indicateur, entrez -fno-objc-arc dans le panneau contextuel, puis cliquez sur Terminé.

entrez la description de l'image ici

Consultez le guide de transition complet ici .


15
L'ARC peut évidemment être désactivé sur une base "par fichier", permettant peut-être l'utilisation de bibliothèques héritées ... Mais je n'ai pas joué avec, donc je ne sais pas encore. Je suis plutôt excité à ce sujet. Pouvez-vous imaginer un monde où les développeurs iOS n'ont pas à transpirer pour conserver / libérer ?? De quoi allons-nous parler ici à SO ?? ;-)
Dan Ray

45
Juste au moment où j'ai enfin une bonne maîtrise de toute cette merde de gestion de la mémoire, et puis ils le rendent inutile. EMPLOIS!!!
Kongress

@Dan: Vous ne plaisantez pas, il peut être désactivé de manière sélective? Veuillez donner un lien, c'est important pour moi! : D
sudo rm -rf

1
Je crois que le compilateur n'est pas sous NDA maintenant, donc pour exclure sélectivement certains fichiers (généralement des dossiers sources tiers) de votre code, ajoutez simplement ceci comme option du compilateur à chaque fichier: -fno-objc-arc
blackjack75

2
@Yar: Oui, vous l'êtes. J'aurais aimé que ce soit aussi simple que cela, mais malheureusement, toutes les bibliothèques ne sont pas aussi simples. Prenez JSONKit, par exemple. Essayez de l'exécuter via la vérification ARC. Vous verrez ce que je veux dire. ;)
sudo rm -rf

170

Pour tous ceux qui souhaitent encore savoir comment désactiver ARC sur des fichiers individuels, voici ce que j'ai fait:

  1. Accédez aux paramètres de votre projet, sous Build Phases > Compile Sources
  2. Sélectionnez les fichiers que vous souhaitez désactiver ARC et ajoutez les indicateurs de compilateur -fno-objc-arc . Vous pouvez définir des indicateurs pour plusieurs fichiers en une seule fois en sélectionnant les fichiers puis en appuyant sur la touche "Entrée".

Je ne sais pas si c'est la méthode recommandée, mais cela fonctionne pour moi.

PS: J'ai rassemblé ces informations sur clang.llvm.org ici qui est accessible au public, donc pas sous NDA.


1
Lorsque j'utilise ce drapeau avec une bibliothèque, cela fonctionne, mais dès que j'inclus le fichier lib .h dans une classe ARC, Xcode se plaint comme si je n'avais pas le drapeau là-bas. Avez-vous pu faire fonctionner des bibliothèques plus anciennes avec cet indicateur?
casey

Je suis en mesure de faire fonctionner ASIHttpRequest et SBJson (j'obtiens 1 avertissement sur l'utilisation de struct dans Reachability.h). J'ai mis le drapeau dans tous leurs fichiers d'implémentation.
pixelfreak

Tous les fichiers d'implémentation ou juste les .h? Dans ma section Compiler les sources du projet, il ne contient que les fichiers d'en-tête, pas de fichiers d'implémentation. Je peux les ajouter, mais cela ne semble pas avoir un effet différent. Pour votre information, j'essaie de faire fonctionner un analyseur REST. ( github.com/mirek/NSMutableDictionary-REST.framework )
casey

1
Ah! Je n'ai pas regardé assez attentivement les erreurs. Ce sont des erreurs différentes de celles sans le drapeau. Je devais juste supprimer le pool de libération automatique du code et wha-la!
casey

Lorsque je sélectionne plusieurs fichiers et appuie sur Entrée, comme cela a été suggéré ici, ils ont tous été supprimés des `` sources de compilation '' dans les phases de construction. J'ai dû les sélectionner individuellement. Je ne sais pas si je fais quelque chose de mal.
Gopalakrishnan Subramanian

10

iOS 5 est toujours sous NDA, et le sera probablement jusqu'à ce qu'ils publient la version publique. Si vous avez un compte développeur, rendez- vous sur les forums des développeurs Apple et demandez-y.

Pour les versions précédentes, vous devez compter les références et conserver et libérer en conséquence. Consultez le guide de gestion de la mémoire .

Edit: Voici une spécification publique pour le comptage automatique des références et une citation de la page publique iOS 5 :

Le comptage automatique de références (ARC) pour Objective-C fait de la gestion de la mémoire le travail du compilateur. En activant ARC avec le nouveau compilateur Apple LLVM, vous n'aurez plus jamais besoin de taper conserver ou publier à nouveau, ce qui simplifie considérablement le processus de développement, tout en réduisant les plantages et les fuites de mémoire. Le compilateur a une compréhension complète de vos objets et libère chaque objet au moment où il n'est plus utilisé, de sorte que les applications s'exécutent aussi vite que jamais, avec des performances prévisibles et fluides.


Les applications développées avec iOS 5 fonctionneront-elles avec les anciens iPhones?
Geekgirl

Vous pourrez utiliser les outils de développement pour les anciens systèmes d'exploitation, mais vous ne pourrez pas utiliser les nouvelles technologies comme ARC. Si vous souhaitez cibler des systèmes d'exploitation plus anciens, vous devrez effectuer une gestion manuelle de la mémoire. Si vous souhaitez utiliser ARC, vous devrez limiter les utilisateurs à iOS 5.
nevan king

1
Une référence à ARC se trouve sur une page publique d'Apple developer.apple.com/technologies/ios5, de sorte qu'au moins certaines parties ne sont pas sous NDA.
cobbal

8
En fait, ce n'est pas tout à fait vrai. Vous pouvez créer pour iOS 4 avec ARC. Citation d'un ingénieur Apple: " Pour iOS 4 et Mac OS 10.6, le compilateur ajoute un peu de code de compatibilité d'exécution à votre application. Cela fonctionne pour tout sauf les variables __weak, qui nécessitent plus de support que le code de compatibilité ne peut en fournir. ARC sur iOS 4 est plus simple que le code non-ARC, mais ce n'est pas aussi simple que ARC sur iOS 5. "Au fait, l'application de planification WWDC a été écrite avec ARC et elle fonctionnait très bien sur iOS 4!
sudo rm -rf

3
Oui; cependant, cela a été qualifié lors de la conférence ARC car seules les cibles 4.3.x obtiennent la «colle de compatibilité».
Alan Zeino le

4

Les détails sont légers / sous NDA pour le moment, mais Apple a implémenté le comptage automatique des références (ARC) dans iOS 5, comme détaillé ici: http://developer.apple.com/technologies/ios5/

Si vous développez une nouvelle application dans Xcode 4 avec le SDK iOS 5, vous pouvez ignorer en toute sécurité le comptage de rétention / libération.

[modifier] sudo rm -rf fait un bon point; les bibliothèques tierces peuvent être considérablement affectées


Les applications développées avec iOS 5 fonctionneront-elles avec les anciens iPhones?
Geekgirl

Cela fonctionnera sur les iPhones exécutant iOS 5, donc seulement l'iPhone 3GS ou l'iPhone 4. Je ne pense pas qu'il prendra en charge iOS 4, mais là encore, c'est fait par LLVM lors de la compilation, il est donc possible de produire un binaire pour iOS 4 et 5. Je recommande vivement d'obtenir un compte développeur iOS et de jouer avec les options disponibles.
Dominic

Comme sudo le souligne dans son commentaire sur la réponse de nevan, vous pouvez en effet revenir sur iOS 4.0 avec ARC, de sorte que les appareils plus anciens qui peuvent exécuter ce système d'exploitation sont compatibles avec cela.
Brad Larson

3

Personne n'a mentionné SystemConfiguration.framework ? N'oubliez pas de le mettre dans Frameworks . J'ai mis misérablement plusieurs heures à m'en rendre compte.


vous devez expliquer pourquoi.
John Riselvato

3

C'est certainement le choix du développeur ou de l'équipe. ARC (Automatic Reference Counter) a rendu les choses un peu plus faciles en gérant automatiquement la mémoire pour vous. Il publiera, conservera et désaffectera le cas échéant. Je pense que vous devriez acquérir de l'expérience dans la gestion de la mémoire vous-même, de préférence dans une application de test, si vous ne l'avez pas déjà fait. Une autre chose à considérer est de savoir si votre application repose sur des bibliothèques tierces qui, si elles ne sont pas converties en ARC, empêcheront votre application de se compiler. Le choix dépend évidemment de la situation actuelle.


0

définir l'indicateur comme -fno-objc-arc dans les paramètres du projet> Phases de construction> Sources de compilation

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.