Problèmes d'import...
zenx
Membre
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 !
Merci pour tous vos commentaires à venir !
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
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 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).