2010-07-15 7 views
4

Je travaille sur un projet avec plusieurs classes personnalisées. J'ai un CardModel (NSObject) qui a des propriétés entières pour contenir des données, et un Deck (NSObject) qui a un tableau pour contenir un groupe de CardModels puis un CardView (UIView) qui a un CardModel comme propriété que je fais quand Je choisis un CardModel à partir d'un Deck. Et puis j'ai un tas de UIViewControllers que je me déplace sur un UINavigationController.quand et où mettre les déclarations @class

Ma question est de savoir où et quand utiliser la directive du compilateur @class.

Si je sous-classe un UIViewController en faisant un nouveau fichier et le sous-classer, dois-je utiliser le @class MyViewController dans l'en-tête de MyViewController.h ou .m et est-ce aller dans l'en-tête du fichier qui utilise en fait le contrôleur (comme quand un contrôleur va instancier un autre type de contrôleur et le pousser vers la pile). Ou dois-je l'utiliser du tout? Est-ce seulement nécessaire si j'ajoute de nouvelles propriétés à ma classe au-delà de ce qui est dans la mise en œuvre du stock? Il semble que je mets @class partout assurez-vous que je ne reçois pas d'erreurs, mais je ne comprends pas fondamentalement quand j'en ai besoin.

Merci!

Répondre

8

Vous pouvez l'utiliser dans le .h pour l'informer sur une classe personnalisée sans inclure le .h pour la classe personnalisée.

Exemple: Deux classes personnalisées: voiture et roue

Car.h 
---------------- 
@interface Car : NSObject { 
} 
- (void)addWheel:(Wheel*)newWheel; 
@end 

Car.h ne connaît pas la classe « roue » de sorte qu'il jetterait une erreur pour que vous puissiez importer le Wheel.h comme si :

Car.h 
---------------- 
#import "Wheel.h" 

@interface Car : NSObject { 
} 
- (void)addWheel:(Wheel*)newWheel; 
@end 

MAIS vous n'avez pas besoin de faire cela non plus. Car.h n'a pas besoin de savoir quoi que ce soit à propos de la classe Wheel, elle a juste besoin de savoir qu'elle existe. Donc, ce que vous utilisez est le @class juste pour dire que "Hey, ce cours existe, prenez ma parole pour cela."

Car.h 
---------------- 
@class Wheel; 

@interface Car : NSObject { 
} 
- (void)addWheel:(Wheel*)newWheel; 
@end 

ensuite à l'intérieur de la Car.m, lorsque vous avez réellement besoin de connaître la classe de roue (propriétés, méthodes, etc.), vous devez importer le Wheel.h là.

+0

Merci - qui semble assez clair. @class dans l'en-tête indique à l'en-tête que les références à cette classe sont correctes. Ensuite, un # import du fichier .h dans le fichier .m correspondant donne accès à l'implémentation à toutes les propriétés et méthodes de la classe. Mais est-ce seulement vrai pour les choses qui sont sous-classées de NSObject, ou toutes les superclasses? Serait-il correct de dire que chaque fois que je fais un "nouveau fichier" et que je choisis une sous-classe, je vais devoir suivre cela, et chaque fois que je viens d'instancier une classe dans mon code qui est une classe normale, je ne ? – Steve

+0

Toutes les superclasses, aussi. '@class X' est simplement un raccourci pour" il existe une classe X pour laquelle il peut y avoir des pointeurs ". Ni plus ni moins. Il est uniquement nécessaire lorsque vous ne pouvez pas importer l'en-tête de la classe en premier (généralement, dans le fichier PCH). – bbum

+0

Je peut avoir la même directive '@class x' dans plusieurs têtes, tant que les en-têtes doivent savoir sur' x', que ce soit comme une propriété ou une méthode qu'ils mettent en œuvre, non? Commencer à se solidifier dans mon esprit - merci! – Steve

4

La directive @class est utilisé lorsque vous avez besoin d'un en-tête pour savoir sur une classe, mais vous ne voulez pas importer le fichier d'en-tête de la classe; par exemple, lorsque vous devez éviter les dépendances circulaires.

Questions connexes