@class ::: import cyclique

jeremosjeremos Membre
18:34 modifié dans API AppKit #1
Bonjour,

Mon premier post sur ce site que je viens de découvrir et qui a l'air fort sympatoche :)


J'ai un problème de compréhension des bases de l'objective-c  dans le cadre de classes qui se référencent elle-mêmes :

Class A détient une propriété vers B
Class B détient une propriété vers A


Pour que le compilateur compile sans souci, je suis obligé de mettre un @class B avant la definition de l'interface dans le .h de A.
avec aussi un #import B.

Dans A pareil mais ça ne semble pas obligatoire .

Quelqu'un pourrais t il m'expliquer le rôle de @class ?

Merci d'avances aux bonnes âmes qui veulent encore expliquer les bases ...

jeremie

Réponses

  • schlumschlum Membre
    18:34 modifié #2
    @class dit juste au compilateur que la classe existe.
  • jeremosjeremos Membre
    18:34 modifié #3
    dans 1197979898:

    @class dit juste au compilateur que la classe existe.


    Et par rapport à  mes références croisées : est-ce normal d'être obligé d'utiliser @class ou ai-je un problème de structure ?
  • psychoh13psychoh13 Mothership Developer Membre
    18:34 modifié #4
    C'est tout à  fait normal et même largement conseillé.
    Lorsque tu compiles, le compilateur a juste besoin dans l'interface de savoir quelle variable d'instance est une classe, d'où l'utilisation de @class :

    class_A.h :
    #import &lt;Cocoa/Cocoa.h&gt;<br /><br />@class class_B;<br /><br />@interface class_A : NSObject {<br />&nbsp; &nbsp; class_B *ivar;<br />}<br />// ...<br />@end
    


    class_A.m :
    #import &quot;class_A.h&quot;<br />#import &quot;class_B.h&quot;<br /><br />@implementation class_A<br />// ...<br />@end
    


    class_B.h
    #import &lt;Cocoa/Cocoa.h&gt;<br /><br />@class class_A;<br /><br />@interface class_B : NSObject {<br />&nbsp; &nbsp; class_A *ivar;<br />}<br />// ...<br />@end
    


    class_B.m :
    #import &quot;class_B.h&quot;<br />#import &quot;class_A.h&quot;<br /><br />@implementation class_B<br />// ...<br />@end
    


    Donc, tu as besoin pour l'@interface de savoir si un objet est une classe ou non, et lorsque tu utilises les méthodes de la classe c'est-à -dire dans l'@implementation, tu as besoin de connaà®tre les prototypes des méthodes. Donc il faut un @class pour l'@interface et un #import pour l'@implementation.

    NB : Une classe a nécessairement besoin de connaà®tre la totalité de l'interface de sa super-classe, donc, s'il s'agit de NSObject, il suffit de faire #import <Cocoa/Cocoa.h> et dans le cas d'une autre super-classe il suffit d'importer le fichier d'en-tête de la classe concernée.
  • jeremosjeremos Membre
    18:34 modifié #5
    Super merci pour ton explication et surtout sa clareté.
    Si seulement les livres Cocoa pouvaient être aussi clairs :)

    jeremie
Connectez-vous ou Inscrivez-vous pour répondre.