346 votes

Quelles sont les meilleures pratiques à utiliser lors de l'écriture Objective-C et Cocoa?

Je sais que sur le HIG (ce qui est très pratique!), mais quelles pratiques de programmation utilisez-vous lors de la rédaction d'Objectif-C, et plus particulièrement lors de l'utilisation de Cacao (ou CocoaTouch).

399voto

Il y a quelques choses que j'ai commencé à faire ce que je ne pense pas que sont standard:

1) Avec l'avènement de propriétés, je ne l'utilise plus "_" préfixe "privé" de variables de classe. Après tout, si une variable peut être consulté par les autres classes ne devrait-il pas être un bien pour elle? J'ai toujours détesté les "_" préfixe pour rendre le code plus laide, et maintenant je peux le laisser dehors.

2) en Parlant de privé choses, je préfère placer privé définitions de méthode au sein de la .m fichier dans une classe de l'extension de la sorte:

#import "MyClass.h"

@interface MyClass ()
- (void) someMethod;
- (void) someOtherMethod;
@end

@implementation MyClass

Pourquoi encombrer le .h fichier avec des choses étrangers ne devrait pas s'en inquiéter? Le vide () fonctionne pour les catégories privées dans le .m de fichier, et les questions de compiler des avertissements si vous ne pas mettre en œuvre les méthodes déclarées.

3) j'ai pris pour mettre dealloc en haut de l' .m fichier, juste en dessous de l' @synthétiser les directives. Ne devrait pas ce que vous dealloc être en haut de la liste des choses que vous voulez penser dans une classe? C'est particulièrement vrai dans un environnement comme l'iPhone.

3.5) Dans les cellules de tableau, faire de chaque élément (y compris la cellule elle-même) opaque pour la performance. Cela signifie que le réglage approprié couleur d'arrière-plan dans tout.

3.6) Lors de l'utilisation d'un NSURLConnection, comme une règle que l'on peut bien vouloir mettre en œuvre la méthode du délégué:

- (NSCachedURLResponse *)connection:(NSURLConnection *)connection
                  willCacheResponse:(NSCachedURLResponse *)cachedResponse
{
      return nil;
}

Je trouve que la plupart des appels web sont très singulier, et c'est plus l'exception que la règle, vous serez vouloir des réponses mises en cache, en particulier pour les appels de service web. La mise en œuvre de la méthode comme indiqué désactive la mise en cache des réponses.

Également d'intérêt, sont quelques-uns iPhone bien spécifique, des conseils, de Joseph Mattiello (reçu dans un iPhone liste de diffusion). Il y a plus, mais ceux-ci étaient les plus utiles, je pensais (à noter que quelques morceaux ont été légèrement modifiées à partir de l'original afin d'inclure des détails offerts dans les réponses):

4) que l'utilisation de la double précision, si vous avez, comme lorsque l'on travaille avec CoreLocation. Assurez-vous de mettre fin à votre constantes dans 'f' de faire de la gcc de les stocker comme flotteurs.

float val = someFloat * 2.2f;

Ce qui est surtout important lors de l' someFloat peut-être en fait un double, vous n'avez pas besoin du mode mixte de mathématiques, puisque vous êtes de perdre de la précision dans le val de stockage. Alors que les nombres à virgule flottante sont pris en charge dans le matériel sur les iPhones, il peut encore prendre plus de temps pour faire du double-précision arithmétique, par opposition à la simple précision. Références:

Sur les téléphones plus anciens soi-disant calculs fonctionnent à la même vitesse, mais vous pouvez avoir plus de composants de précision dans les registres que doublé, pour un grand nombre de calculs en simple précision, finissent par être plus rapide.

5) Définissez vos propriétés en tant que nonatomic. Ils sont atomic par défaut et sur la synthèse, sémaphore code sera créé pour éviter le multi-threading problèmes. 99% de vous n'avez probablement pas besoin de s'inquiéter à ce sujet et le code est beaucoup moins lourd et plus efficace de la mémoire lorsque la valeur nonatomic.

6) SQLite peut être une très, très moyen rapide de cache de grands ensembles de données. Une carte d'application, par exemple, peut cache ses tuiles en SQLite fichiers. La partie la plus chère de disque I/O. Éviter de nombreuses petites écrit par l'envoi d' BEGIN; et COMMIT; entre les grands blocs. Nous utilisons les 2 secondes de la minuterie, par exemple, qui se remet à zéro à chaque nouvelle soumettre. Quand il arrive à expiration, nous envoyer COMMETTRE; , ce qui provoque toutes vos écritures d'aller dans une grande partie. SQLite stocke les données de la transaction sur le disque et de faire ce début/Fin emballage évite la création de nombreux dossiers de transaction, le regroupement de l'ensemble des transactions en un seul fichier.

Aussi, SQL bloquer votre interface graphique, si c'est sur votre thread principal. Si vous avez une très longue requête, C'est une bonne idée de stocker vos requêtes que des objets statiques, et exécuter SQL sur un thread séparé. Assurez-vous d'envelopper tout ce qui modifie la base de données pour les chaînes de requête en @synchronize() {} blocs. Pour faire court requêtes de laisser les choses sur le thread principal pour faciliter la commodité.

Plus SQLite conseils d'optimisation sont ici, bien que le document s'affiche de jour de nombreux points sont probablement encore bonne;

http://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html

110voto

mmalc Points 7663

N'utilisez pas inconnu chaînes de caractères comme des chaînes de format

Lorsque les méthodes ou les fonctions d'une chaîne de format argument, vous devez vous assurer que vous avez le contrôle sur le contenu de la chaîne de format.

Par exemple, lors de l'enregistrement de chaînes, il est tentant de passer la variable de chaîne comme unique argument d' NSLog:

    NSString *aString = // get a string from somewhere;
    NSLog(aString);

Le problème, c'est que la chaîne peut contenir des caractères qui sont interprétés comme des chaînes de format. Cela peut conduire à des erreurs de sortie, des accidents, et des problèmes de sécurité. Au lieu de cela, vous devez remplacer la variable de chaîne dans une chaîne de format:

    NSLog(@"%@", aString);

108voto

Chris Hanson Points 34485

L'utilisation standard de Cacao de nommage et de mise en forme des conventions et de la terminologie plutôt que ce que vous avez l'habitude de partir d'un autre environnement. Il sont beaucoup de Cacao développeurs là-bas, et quand un autre l'un d'eux commence à travailler avec votre code, il sera beaucoup plus facile à suivre si il ressemble et se sent semblable à d'autres de Cacao code.

Des exemples de quoi faire et quoi ne pas faire:

  • Ne pas déclarer id m_something; dans l'interface de l'objet et de l'appeler un membre de la variable ou champ; utiliser something ou _something pour son nom et l'appeler une variable d'instance.
  • Ne nommez pas un getter -getSomething; le bon de Cacao nom est juste -something.
  • Ne nommez pas un setter -something:; il convient -setSomething:
  • Le nom de la méthode est alternent avec des arguments et comprend deux points; il est -[NSObject performSelector:withObject:], pas NSObject::performSelector.
  • L'utilisation inter-caps (CamelCase) dans les noms de méthode, les paramètres, les variables, les noms de classe, etc. plutôt que de underbars (souligne).
  • Classe les noms commencent par une majuscule, les variables et les noms de méthode avec les bas-de-casse.

Quoi que vous fassiez, ne pas utiliser de Win16/Win32-style notation hongroise. Même Microsoft a abandonné qu'avec le passage à l' .NET plate-forme.

107voto

mmalc Points 7663

IBOutlets

Historiquement, la gestion de la mémoire de points de vente a été mauvaise. Actuellement la meilleure pratique consiste à déclarer des points de vente comme des propriétés:

@interface MyClass :NSObject {
    NSTextField *textField;
}
@property (nonatomic, retain) IBOutlet NSTextField *textField;
@end

En utilisant les propriétés rend la gestion de la mémoire sémantique claire; il fournit également un modèle cohérent si vous utilisez la variable d'instance de la synthèse.

98voto

mmalc Points 7663

Utiliser la LLVM/Clang Analyseur Statique

REMARQUE: Sous Xcode 4 c'est maintenant intégré dans l'IDE.

Vous utilisez le Bruit Analyseur Statique -- sans surprise -- analyse de votre C et le code Objective-C (pas C++ encore) sur Mac OS X 10.5. Il est trivial à installer et à utiliser:

  1. Télécharger la dernière version de cette page.
  2. À partir de la ligne de commande, cd de votre répertoire de projet.
  3. Exécuter scan-build -k -V xcodebuild.

(Il y a quelques contraintes supplémentaires, etc., en particulier, vous devez analyser un projet dans son "Debug" configuration -- voir http://clang.llvm.org/StaticAnalysisUsage.html pour plus de détails -- mais c'est plus ou moins ce qui se résume.)

L'analyseur produit alors un ensemble de pages web qui montre probablement la gestion de la mémoire et d'autres problèmes de base que le compilateur est pas en mesure de détecter.

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