2010-10-11 7 views
44

peut-on s'il vous plaît expliquer moi ce que fait la déclaration @class dans l'objectif & quels sont les cas dans lesquels nous devrions utiliser cette déclaration.Que fait @class en Objective-C?

Répondre

83

C'est une déclaration directe. Il indique essentiellement au compilateur qu'il existe une classe de ce nom. Je l'utilise dans les déclarations d'interface:

@class Foo; 
@interface Bar : NSObject { 
    Foo *someFoo; 
} 
@end 

Vous pouvez bien sûr importer l'en-tête pour Foo à la place:

#import "Foo.h" 
@interface Bar : NSObject { 
    Foo *someFoo; 
} 
@end 

Mais si someFoo ne sont pas exposés aux utilisateurs de Bar, ils importeraient un en-tête supplémentaire fichier qui ne leur est d'aucune utilité. Avec la déclaration @class les utilisateurs de Bar ne voient aucune importation supplémentaire, car Foo.h sera importé dans le fichier d'implémentation de Bar.

+1

Explication brillante, Juste appris quelque chose de nouveau! Merci – pnizzle

+0

Je ne comprends toujours pas entièrement et je sais que c'est un ancien poste mais et l'exemple serait bon. Que voulez-vous dire par "Utilisateurs de Bar", les classes qui auront un objet bar en eux? Imean dans votre exemple Foo est un objet dans Bar. Alors whast la différence entre #import et @class dans cette situation? – Esko918

+0

En effet une merveilleuse explication. J'ai fait face à une situation plus tôt où j'aurais dû l'utiliser. De toute façon, maintenant je peux certainement. :) – Ron

23

il s'agit d'une déclaration directe.

vous utilisez cette directive pour indiquer au compilateur qu'il existe une classe objc avec le nom spécifié. vos autres options sont d'inclure l'interface, ou utilisez id pour les variables ou les types.

Ceci est utile pour minimiser les dépendances. Je les utilise chaque fois que je le peux pour minimiser les dépendances et réduire considérablement les temps de construction.

c'est le même que dans c et C++:

struct mon_struct; 
namespace MON { class mon_class; } 
+3

+1 pour le basculement que cela devrait être préféré afin de réduire les temps de construction. –

1

@class est utilisé pour la création avant la déclaration de toute catégorie. Si vous créez une classe dont l'implémentation vous est inconnue, vous pouvez le faire en utilisant la directive de compilation @class.

Vous pouvez implémenter cette classe lorsque l'implémentation vous est connue.

8

espère que cela aidera peu plus

Au-dessus de réponse état déjà presque tout, je voudrais ajouter quelque chose à ce sujet. Le @class Foo est une déclaration directe de la classe Foo. C'est comme dire au compilateur, la classe foo existe donc ne vous en souciez pas pour le moment.

Remarque: - La déclaration de classe devient très critique lorsque les deux classes ont besoin l'une de l'autre. si nous faisons l'exemple #import habituel alors, nous aurions une boucle sans fin des importations et les compilateurs n'aimeraient pas les boucles sans fin. Nous utilisons donc @class Classname.