Problèmes d'import...

zenxzenx Membre
08:40 modifié dans API AppKit #1
J'ai un soucis avec un import dans un de mes projets. Lorsque je fais mon import dans le fichier header de la classe que je développe et que j'essaye de compiler le tout, il me fait des erreurs en me disant que certaines méthodes appelées dans ma classe ne sont pas déclarées. Par contre, si je fais l'import directement dans le fichier .m, il n'y a aucunes erreurs. Quelqu'un a t il déjà  rencontré ce problème ?

Merci pour tous vos commentaires à  venir !  ;)

Réponses

  • maestricmaestric Membre
    08:40 modifié #2
    Oui, j'ai eu récemment le même problème. Je pense que c'est à  cause des références croisées : une classe A qui connait une classe B, et une classe B qui connait une classe A. Il doit se demander qui compiler en premier..
  • aranaudaranaud Membre
    08:40 modifié #3
    J'ai eu aussi ce genre de problème. Par la suite j'ai pris l'habitude de n'importer les fichiers header que dans les fichiers .m.
  • février 2006 modifié #4
    Les règles pour les import:


    Que mettre dans le .h
    - Les imports des frameworks système se font dans le .h. Petite nuance ceci dit, mis à  part le framework dont provient la classe parent de la sous classe maison, ils peuvent être mis dans le .m, mais cela peut s'avérer gênant pour les déclarations des variables d'instance et des méthodes.
    Ex:
    [tt]#import <Cocoa/Cocoa.h>
    #import <WebKit/WebKit.h>

    @interface MaClasse : NSObject {
    ...[/tt]

    - Pour les classes héritant d'une classe maison, un import de la classe parent suffit (pas la peine de rajouter les frameworks, ils ont été rajoutés dans la classe parent, donc implicitement à  toutes les classes qui importent son .h).
    Ex:
    [tt]#import "MaClasse.h"

    @interface MaSousClasse : MaClasse {
    ...[/tt]

    - Pour les protocoles (qu'il vaut mieux idéalement ne pas déclarer dans le même fichier qu'une classe

    Quand mettre dans le .m
    - Pour toutes les classes maison autre que la classe parent. Si cependant d'autres classes maisons doivent être utilisées dans le .h (pour la déclaration de variables d'instances ou de méthodes), on utilise dans le .h la directive [tt]@class MaClasse[/tt]

    Ex: .h de MaSousClasse

    [tt]#import "MaClasse.h"

    @class UneAutreClasse, EtEncoreUneAutreClasse;

    @interface MaSousClasse : MaClasse {
    ...[/tt]

    Et dans le le .m

    [tt]#import "MaSousClasse.h"

    #import "UneAutreClasse.h"
    #import "EtEncoreUneAutreClasse.h"

    @implementation MaSousClasse
    ...[/tt]

    L'explication de cette séparation: à  la compilation, est créé un fichier intermédiaire où est les #import ... sont remplacés par les contenus correspondant. Si on prend 2 sous classes (A et B) dont les header sont:

    [tt]#import <Cocoa/Cocoa.h>
    #import "B.h"

    @interface A : NSObject {
    B aVariable;
    }
    @end[/tt]

    et pour B
    [tt]#import <Cocoa/Cocoa.h>
    #import "A.h"

    @interface B : NSObject {
    A aVariable;
    }
    @end[/tt]

    Le code intermédiaire pour A.m sera:
    [tt] // tout le bazard de Cocoa.h

    @interface B : NSObject {
    A aVariable;
    }
    @end

    @interface A : NSObject {
    B aVariable;
    }
    @end

    // l'implémetnation
    [/tt]

    Problème: dans la déclaration des variables de B, il y a un A alors que A n'a pas encore été déclaré (même si on est "dans" A.m).
Connectez-vous ou Inscrivez-vous pour répondre.