Utilisez-vous @class ?
Neofelis
Membre
Bonjour,
J'ai un livre qui conseille de placer les @class maClass dans les fichiers .h (l'en-tête) et l'inclusion de la classe (import "maClasse.h") dans les fichiers .m (l'implémentation). Y'a-t-il une utilité à cette méthode (mise à part pour résoudre les dépendances circulaires) sachant qu'en plaçant les import directement dans le fichier.h cela marche tout aussi bien (vu que le .h est lui dans tous les cas inclus dans le .m) ?
J'ai un livre qui conseille de placer les @class maClass dans les fichiers .h (l'en-tête) et l'inclusion de la classe (import "maClasse.h") dans les fichiers .m (l'implémentation). Y'a-t-il une utilité à cette méthode (mise à part pour résoudre les dépendances circulaires) sachant qu'en plaçant les import directement dans le fichier.h cela marche tout aussi bien (vu que le .h est lui dans tous les cas inclus dans le .m) ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Si tu "#import maClass.h" dans ton fichier "moncode.h", dès que tu vas modifier l'interface de ta clase maClass par exemple en rajoutant une méthode, le maClass.h va être modifié, et comme il est #importé dans moncode.h, moncode.h va être recompilé, et tous les fichiers qui #import moncode.h également, etc... du coup ça recompile beaucoup de choses en général pour rien.
Alors que si tu ne "#import maClass.h" que dans ton fichier d'implémentation "moncode.m", seul moncode.m sera recompilé, et les fichiers qui incluent moncode.h ne seront pas affectés et pas recompilés, ce qui est plus logique car il n'y a aucune raison de tout recompiler pour ça.
Donc utiliser les @class dans ton .h et les #import dans ton .m te permet d'éviter que Xcode recompile plein de fichiers inutilement si tu as modifies ton "maClass.h", mais qu'il ne recompile que le nécessaire.
Pourtant un @class ne suffit pas toujours dans le .h, par exemple lorsque je veux que Toto se conforme au protocol TataDelegate, un @class Tata; dans Toto.h ne suffira pas.. une raison particulière?
Toutefois, le fichier Tata.h n'est pas importé. Le compilateur ne connaitra pas les méthodes et propriétés de la classe. Si ton protocole TataDelegate y est déclaré, le compilateur ne peut pas connaitre le symbole TataDelegate à moins d'importer le .h.
(Ceci dit, d'aprés mes souvenirs, on peut utiliser la commande @protocol TataDelegate; pour signifier au compilateur que TataDelegate est un protocole. Sans certitude aucune).
Tata.h
Si on n'écrit pas [tt]@class Tata[/tt]; le compilateur se plaint de la déclaration de la méthode de protocole [tt]tata:didSomethingWithResult:[/tt], puisqu'il ne connait pas le type [tt]Tata *[/tt].
En pratique, on est nombreux à mettre directement un #import dans le .h parce que c'est tellement plus simple.
Mais c'est pas pour autant qu'on a raison, car en terme d'optimisation du process de compilation ça peut vite augmenter le temps nécessaire à faire une compilation itérative d'un projet juste à cause d'une petite modification.
Surtout si tu bosses sur une machine merdique.
Pourtant XCode me retourne l'erreur suivante : ITAddPlaceViewController.h:14: error: cannot find interface declaration for 'ITCollapsibleViewController', superclass of 'ITAddPlaceViewController'
Y aurait-il une exception à l'utilisation de @Class en cas d'héritage ? ???
@classe ne donne pas accès à ces variables membres.
Il faut donc passer par un import.
Dans un .h, il ne faut inclure/importer que le strict minimum nécessaire (donc à priori on utilise @class foo; et @protocol bar; au maximum, on n'importe pas les déclarations de foo et de bar).