30 votes

Quelle est la différence entre le n ° d'importation et d' @classe, et quand dois-je utiliser l'un plutôt que l'autre?

J'ai enseigné moi-même Objective-C au cours du dernier mois ou si (je suis un Java de la tête) et j'ai obtenu mon cerveau enroulé autour de la plupart de maintenant. La seule chose que me confondre en ce moment: Quelle est la différence entre l'importation d'une classe via @classe de vs faire un #import?

Est-ce mieux qu'un autre, ou dois-je utiliser à la place de l'autre dans certains cas? J'ai été en utilisant simplement #importer jusqu'à présent.

66voto

Ben Gottlieb Points 59900

#import apporte l'intégralité de l'en-tête du fichier en question dans le fichier en cours; tous les fichiers que fichier #imports sont également inclus. @classe, d'autre part (lorsqu'il est utilisé sur une ligne par lui-même avec certains noms de classe), indique au compilateur "Hé, vous allez voir un nouveau jeton bientôt; c'est une classe, donc la traiter de cette façon).

Ceci est très utile quand vous avez le potentiel pour de la circulaire comprend"; c'est à dire, l'Objet1.h fait référence à l'Objet2, et Object2.h fait référence à l'Objet1. Si vous #importles deux fichiers dans l'autre, le compilateur ne peut se confondre comme il essaie de #import Objet1.h, regarde dans et il voit l'Objet2.h, il essaie d' #import Objet2.h, et voit l'Objet1.h, etc.

Si, d'autre part, chacun de ces dossiers a @class Object1; ou @class Object2;, alors il n'y a pas de référence circulaire. Juste être sûr de réellement #import les en-têtes dans votre application (.m) des fichiers.

27voto

Dave Dribin Points 3175

@class est appelé une déclaration anticipée. Vous avez l'impression de dire au compilateur que la classe existe, mais rien sur la classe. Donc, il ne sait pas des trucs comme sa super-classe et quelles sont les méthodes qu'il déclare.

En règle générale, utilisez @class dans la .h et #import dans la .m, si possible. Comme Louis dit, il va aider à accélérer les temps de compilation. Il ya des moments où vous avez besoin d' #import d'une classe dans l'en-tête, cependant. Cas je peux penser en ce moment sont:

  • Vous êtes sous-classement d'une autre classe
  • Vous êtes à la mise en œuvre d'un protocole

Dans ces cas, vous devez d' #import le fichier d'en-tête où la classe ou le protocole est déclaré, parce que le compilateur a besoin de savoir toute la hiérarchie de classe de ses classes parentes et la mise en œuvre des protocoles.

FWIW, vous pouvez déclarer avant protocoles, trop, aussi longtemps que votre pas de les mettre en œuvre:

@protocol SomeProtocol;

@interface ...

- (id<SomeProtocol>)someMethod;

@end

5voto

Louis Gerbarg Points 33025

L'autre chose que vous voulez garder à l'esprit est que #importations de ralentir votre temps de compilation, car elle signifie que le compilateur a besoin de tirer et de travailler à travers beaucoup plus de fichiers d'en-tête. C'est surtout masquée par l'utilisation d'en-têtes précompilés, mais j'ai parfois été remis projets de croix importés chaque en-tête au lieu d'utiliser @classe le cas échéant, et en les fixant peuvent améliorer les temps de compilation. Il est de manière subtile, le système renforce le fait que si vous n'utilisez que ce dont vous avez réellement besoin que les choses aillent plus vite.

En règle générale, j'ai toujours utiliser @déclarations de classe dans mes fichiers d'en-tête, et seulement #importation de la super-classe. Qui tombe en droite ligne avec Ben suggestions, mais j'ai pensé qu'il était intéressant de noter que même si vous n'êtes pas inquiet au sujet de la circulaire refs c'est une bonne idée pour limiter #importations dans les fichiers d'en-tête si vous le pouvez.

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