86 votes

Objective-C: @classe Directive avant le @de l'interface?

Quelle est la différence entre ces deux déclarations de classe? Je ne comprends pas pourquoi @classe est utilisée ici. Merci.

@class TestClass;

@interface TestClass: UIView {
    UIImage *image1;
    UIImage *image2;
}

et

@interface TestClass: UIView {
    UIImage *image1;
    UIImage *image2;
}

211voto

bbum Points 124887

@class existe pour briser les dépendances circulaires. Disons que vous avez les classes A et B.

@interface A:NSObject
- (B*)calculateMyBNess;
@end

@interface B:NSObject
- (A*)calculateMyANess;
@end

De poulet, de rencontrer l'Ovule. Cela ne peut jamais compiler, car Un de l'interface dépend de B en cours de définition et vice-versa.

Ainsi, il peut être fixé en utilisant @class:

@class B;
@interface A:NSObject
- (B*)calculateMyBNess;
@end

@interface B:NSObject
- (A*)calculateMyANess;
@end

@class efficacement indique au compilateur que cette classe existe quelque part et, donc, les pointeurs, a déclaré à point pour les instances de la classe dit sont parfaitement valides. Cependant, vous ne pouviez pas appeler une méthode sur une instance de référence dont le type est défini comme un @class car il n'y a pas de métadonnées supplémentaires disponibles pour le compilateur (je ne me souviens pas si il revient à l'appel du site est en cours d'évaluation comme un appel à l'aide d' id ou pas).

Dans votre exemple, l' @class est inoffensif, mais tout à fait inutile.

18voto

poncha Points 4777
@class TestClass;

Ce que déclare "class Classetest seront définis".

Dans ce cas (celui que vous avez collé) cela n'a aucun effet que ce soit, de sorte que ces sont les mêmes.

Toutefois, dans le cas où vous allez définir un protocole qui permettrait d'utiliser votre nom de la catégorie (type de paramètres passés à déléguer, par exemple), vous devrez déclarer @class TestClass avant la définition de protocole, comme votre classe n'est pas encore défini.

En général, si vous avez besoin de mentionner le nom de la classe avant la définition de la classe, vous en aurez besoin pour émettre @class déclaration de la première

7voto

Tommy Points 56749

Comme par Matt réponse il n'y a absolument aucun point à l' @class déclaration dans votre code. @class avant définit une classe de sorte que le compilateur sait par la suite ce type d'unité que vous faites allusion. Depuis Objective-C est à peu près sans type à l'exécution, c'est souvent tout ce que le compilateur a vraiment besoin de savoir - juste assez pour distinguer la chose à partir de l'atome C de la valeur.

Je vais prendre un coup de poignard dans le noir et de dire que, parce que les variables d'instance sont déclarées dans l' @interface vous êtes à la recherche à un certain ancien code. Parce que c'est un vieux code, l' @class probablement utilisé pour être quelque part d'autre (par exemple, il y avait un délégué protocole déclarée entre les deux) et vient de se terminer sans danger brin.

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