Objective-C: déclaration de classe à terme

RootViewController une application RootViewController -vues qui utilise une classe appelée RootViewController pour basculer entre les vues.

Dans mon en MyAppDelegate tête MyAppDelegate , je crée une instance de RootViewController appelée rootViewController . J’ai vu des exemples de tels cas où la directive @class est utilisée comme “déclaration de classe avancée”, mais je ne suis pas tout à fait sûr de ce que cela signifie ou accomplit.

 #import  @class RootViewController; @interface MyAppDelegate . . . 

Il indique essentiellement au compilateur que la classe RootViewController existe, sans spécifier exactement à quoi il ressemble (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, où ClassA a un membre de type ClassB* et ClassB a un membre de type ClassA* . Vous devez avoir ClassB déclaré avant de pouvoir l’utiliser dans ClassA , mais vous devez également avoir déclaré ClassA avant de pouvoir l’utiliser dans ClassB . Les déclarations ClassA vous permettent de surmonter cela en disant à ClassA que ClassB existe, sans avoir à spécifier ClassB's spécifications complètes ClassB's .

Une autre raison pour laquelle vous avez tendance à trouver beaucoup de déclarations anticipées est que certaines personnes adoptent une convention de classes déclarant à l’avance, sauf si elles doivent absolument inclure la déclaration complète. Je ne me souviens pas tout à fait, mais c’est peut-être quelque chose que Apple recommande dans ses lignes direcsortingces de style Objective-C.

En poursuivant mon exemple ci-dessus, si vos déclarations de ClassA et ClassB trouvent respectivement dans les fichiers ClassA.h et ClassB.h , vous devrez #import celui qui utilisera 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 plusieurs classes, chacune nécessitant un élément # import) et améliore les performances de compilation en minimisant quantité de code que le compilateur doit prendre en compte lors de la compilation d’un fichier donné.

En passant, bien que la question concerne uniquement les déclarations avancées dans Objective-C, tous les commentaires précédents s’appliquent également au codage en C et C ++ (et probablement dans de nombreux autres langages), qui prennent également en charge la déclaration mêmes fins.

Les déclarations directes servent principalement à éviter les importations circulaires, où un fichier importe un autre fichier qui importe le premier fichier, etc. Lorsque vous importez un fichier, le contenu du fichier est substitué au point d’importation lorsque vous créez votre projet. au compilateur. Si vous avez des importations circulaires, vous aurez une boucle infinie qui ne sera jamais compilée. Heureusement, xcode vous en informera avant d’essayer. La déclaration forward indique “N’importez pas cette classe mais sachez simplement qu’elle existe”. Sans une déclaration d’importation ou de transmission, vous obtenez une erreur indiquant que cette classe n’existe pas.