Importer un header dans tout le projet

JegnuXJegnuX Membre
Bonjour

Voilà  je me demandais quelle était la meilleure solution pour importer un header dans tout le projet ?

Par exemple les headers de mes categories, j'aimerais l'importer à  un seul endroit, et comme ça XCode ne me met pas de warning si jamais j'ai pas importé ma categorie dans une de mes classe.

Pour le moment je les met dans mon _Prefix.pch en dessous de Fondation et UIKit (donc dans le "ifdef __OBJC__") et ça marche bien, mais après je sais pas si c'est la bonne solution ou si y'en a pas des meilleures. Je me dis que peut-être que le prefix est utilisé pour autre chose et que c'est pas judicieux de les y mettre dedans. C'est donc pourquoi je souhaiterais une confirmation de votre part :-)

Ah et au passage, j'aurais besoin d'un petit rappel sur les headers justement : dans un .m normalement je ne dois importer que le .h correspondant à  l'interface de la classe c'est bien ça ? si j'ai besoin d'autres classes ou frameworks je dois les mettre dans le .h ou bien on s'en fou et je peux mettre direct dans le .m ?

Donc voilà  si vous pouviez me redonner quelques rappels de base ça serait cool ^^ Merci

Réponses

  • 17:44 modifié #2
    .h ou .m, peut importe.
    Il faut juste savoir si tu importe XX.framework dans Tata.h, et que dans Toto.h tu importes que Tata.h, tu auras aussi XX.framework importé dans Toto.
    Si tu veux que ça ne sorte pas de Toto, tu importes XX.framework dans le .m
  • JegnuXJegnuX Membre
    17:44 modifié #3
    ce que tu dis ne fonctionnes que pour les frameworks ?
    Je veux dire, si j'importe titi.h dans tata.h, et que j'importe tata.h dans toto.h, est-ce que ça importe aussi titi.h dans toto.h ?

    sinon je pense que tu voulais dire "Si tu veux que ça ne sorte pas de Tata, tu importes XX.framework dans le .m"
    C'est ça d'utiliser des noms débiles :p
  • yoannyoann Membre
    17:44 modifié #4
    Alors pour l'utilisation du PCH c'est justement l'intérêt du truc donc tu fait très bien.

    Pour l'inclusion des .h dans les .h ou dans les .m tout va dépendre du cas.

    Pour la quasi totalité des situation j'inclus tout dans le .m, le .h ne contiens que Cocoa/Cocoa.h, si par exemple j'utilise une iVar de type Employee je rajoute un @class Employee avant le @interface dans le .h.

    Cela évite les références croisé et inclusion de .h un peut partout (bien que ce ne soit pas génant, #import protège de lui même les .h). Je trouve ça plus propre et c'est une bonne habitude lorsqu'on travail sur des framework.


    Le seul cas où je trouve intéressant d'inclure dans le .h c'est lorsqu'une méthode renverra un objet non inclus dans Cocoa/Cocoa.h, si j'ai en return un objet de type Employee, alors je met l'inclusion dans le .h
  • AliGatorAliGator Membre, Modérateur
    17:44 modifié #5
    Pareil que yoann, j'ai les mêmes pratiques (du moins idéalement... j'avoue que l'habitude de faire le #import dans le ".h" même quand ça ne serait nécessaire d'avoir la définition complète de la classe que dans le .m a la vie dure parfois). Bien souvent pour implémenter un @protocol défini dans un .h il faut aussi inclure ce .h, mais sinon...

    La bonne pratique est de se contenter de déclarer l'existence des choses dans le .h, et leur définition complète dans le .m. Comme tu le fais pour les méthodes où tu ne mets que leur signature dans le .h et leur code dans le .m, il est donc de bon aloi de ne faire que déclarer que la classe Machin existe " avec une ligne "@class Machin" dans le .h " parce que tu as besoin que le compilateur ait connaissance de l'existence de ladite classe (pour pas qu'il gueule en disant "hé tu utilises un "Machin" mais ça n'existe pas", en gros tu lui dis "t'inquiète, je te dis que Machin ça existe, je t'expliquerai plus tard " dans un .m " ce que c'est au juste). Et de n'importer toute la classe et donc son API complète (savoir quelles méthodes du as le droit d'appeler, etc) dans le .m qui en a besoin.


    En gros faire un #import du .h de la classe Machin que quand tu as besoin d'utiliser explicitement ce qui est dans le .h (appeler une méthode de la classe Machin, déclarée dans le dit .h, appel de méthode dont tu n'as besoin que dans le .m de ta classe qui utilise Machin).

    Après évidemment, d'une part c'est pas un drame de faire le #import dans le .h même si ça suffirait de le faire dans le .m et se contenter de "@class"; dans le .h". Et beaucoup de monde le fait comme ça d'ailleurs, par flemme ou méconnaissance de la directive @class ou autre. C'est juste que c'est un peu inutile et que ça peut avoir des effets de bords sur le temps de compilation (genre si tu changes des lignes dans Machin.h, au moment de compiler il va recompiler tous les fichiers qui importent Machin.h, donc tous les .h où tu as mis #import "Machin.h"... et tous les ".m" de ces classes puisque ces .m importent leur ".h" correspondant qui viendra à  son tour d'être recompilé, etc... bref ça recompile des trucs pour rien, c'est pas un drame, mais c'est un peu bête :P
  • JegnuXJegnuX Membre
    17:44 modifié #6
    Merci pour vos réponses est explications ! Je m'en vais nettoyer un petit peu mon code ;-)
  • muqaddarmuqaddar Administrateur
    17:44 modifié #7
    J'en profite pour poser la question qui hante mes jours et mes nuits depuis un moment...

    Puisque, dans Prefix.pch, Apple importe par défaut :

    #ifdef __OBJC__<br />&nbsp; &nbsp; #import &lt;Foundation/Foundation.h&gt;<br />&nbsp; &nbsp; #import &lt;UIKit/UIKit.h&gt;<br />#endif
    


    Pourquoi dans chaque nouvelle classe créée par défaut, Apple écrit :

    #import &lt;Foundation/Foundation.h&gt;
    


    ou

    #import &lt;UIKit/UIKit.h&gt;
    


    selon le type de classe ?

    Simple double précaution ?
  • yoannyoann Membre
    17:44 modifié #8
    Je pense par double protection oui, avoir une classe fonctionnelle independament du pch
Connectez-vous ou Inscrivez-vous pour répondre.