web-dev-qa-db-fra.com

Objectif-C: Déclaration de classe à terme

J'écris une application multivue qui utilise une classe appelée RootViewController pour basculer entre les vues.

Dans mon en-tête MyAppDelegate, je crée une instance de RootViewController appelée rootViewController. J'ai vu des exemples de cas où la directive @class est utilisée comme "déclaration de classe directe", mais je ne sais pas trop ce que cela signifie ou accomplit.

#import <UIKit/UIKit.h>
@class RootViewController;
@interface MyAppDelegate
.
.
.
47
Old McStopher

Il indique essentiellement au compilateur que la classe RootViewController existe, sans spécifier à quoi elle ressemble exactement (c'est-à-dire: ses méthodes, ses propriétés, etc.). Vous pouvez l'utiliser pour écrire du code qui inclut des variables membres RootViewController sans avoir à inclure la déclaration de classe complète.

Ceci est particulièrement utile pour résoudre les dépendances circulaires - par exemple, lorsque ClassA a un membre de type ClassB* et ClassB a un membre de type ClassA*. Vous devez avoir déclaré ClassB avant de pouvoir l'utiliser dans ClassA, mais vous devez également déclarer ClassA avant de pouvoir l'utiliser dans ClassB. Les déclarations avancées vous permettent de surmonter cela en disant à ClassA que ClassB existe, sans avoir à spécifier réellement ClassB's spécification complète.

Une autre raison pour laquelle vous avez tendance à trouver beaucoup de déclarations avancées est que certaines personnes adoptent une convention de classes de déclaration avancée, sauf si elles doivent absolument inclure la déclaration complète. Je ne me souviens pas entièrement, mais c'est peut-être quelque chose que Apple recommande dans ses directives de style de guidage Objective-C.

Poursuivant mon exemple ci-dessus, si vos déclarations de ClassA et ClassB sont dans les fichiers ClassA.h et ClassB.h respectivement, vous devez #import celui qui utilise sa déclaration dans l'autre classe. L'utilisation de la déclaration directe signifie que vous n'avez pas besoin du #import, ce qui rend le code plus joli (en particulier une fois que vous commencez à collecter un certain nombre de classes, dont chacune aurait besoin d'un `#import où il est utilisé), et augmente les performances de compilation en minimisant la quantité de code que le compilateur doit prendre en compte lors de la compilation tout fichier donné.

Soit dit en passant, bien que la question concerne uniquement les déclarations à terme dans Objective-C, tous les commentaires de procédure s'appliquent également au codage en C et C++ (et probablement dans de nombreux autres langages), qui prennent également en charge la déclaration à terme et l'utilisent généralement pour le mêmes fins.

101
Mac

Les déclarations avancées sont principalement destinées à éviter les importations circulaires, où un fichier importe un autre fichier qui importe le premier fichier, etc. au compilateur. Si vous avez des importations circulaires, vous auriez une boucle infinie qui ne se compilerait jamais. Heureusement, xcode vous en parlera avant d'essayer. La déclaration directe indique "N'importez pas cette classe mais sachez simplement qu'elle existe." Sans importation ni déclaration directe, vous obtenez une erreur indiquant qu'aucune classe de ce type n'existe.

2
Aks