Protocol et library

groumpfgroumpf Membre
Salut,

j'ai une librarie qui utilise une autre librarie, et en particulier un viewController qui implémente un Protocol de l'autre librairie.
Comment faire pour limiter voir supprimer le besoin d'inclure (pour l'utilisateur de ma librairie) les .h de l'autre librairie ?
Pour les membres de la classe je peux utiliser @class mais pour le protocol je ne vois pas comment faire :

<br />@class AutreLib_A;<br /><br />@interface MonViewController : UIViewController &lt;AutreLib_Protocol&gt;<br />{<br />	AutreLib_A *a;<br />}<br />@end<br />


D'une manière générale je suis étonné qu'on soit obligé de divulguer autant de choix d'implémentation dans les .h. En fait ce que je voudrais c'est masquer totalement l'implémentation mais je sens que c'est impossible.

Réponses

  • groumpfgroumpf Membre
    03:35 modifié #3
    J'ai bien essayé de mettre une déclaration de protocol mais j'obtiens un warning comme toi. Comme cela me parait inévitable, je suis obligé d'inclure le .h tant pis.
    De toute façon la lib AutreLib est déjà  "dévoilée" par le nom des classes.
    C'est vraiment de la bidouille pour des problèmes simples. Je me demande si Eiffel est mieux à  ce niveau. Bref. Merci quand même.
  • 03:35 modifié #4
    Si tout ton projet est en partie basé sur l'autre library, tu peux important la library dans le PCH de ton projet. Généralement je fais ça pour les trucs le plus souvent réutilisés (comme des category)
  • muqaddarmuqaddar Administrateur
    03:35 modifié #5
    dans 1318252547:

    Si tout ton projet est en partie basé sur l'autre library, tu peux important la library dans le PCH de ton projet. Généralement je fais ça pour les trucs le plus souvent réutilisés (comme des category)


    Je fais pareil, c'est juste pour faire raler Céroce.  >:D ;D
  • groumpfgroumpf Membre
    03:35 modifié #6
    En fait je ne fait pas une application mais une librairie (qui utilise d'autres lib). Donc je ne crois pas avoir accès au PCH dans ce cas.

    A ce propos, il m'est arrivé un truc inattendu : quand j'ai inclu les 2 .a (le mien et l'autre) dans une appli de test, xcode m'a sorti une erreur duplicate entry.
    J'ai supprimé l'autre .a et tout a marché.
    Quelqu'un peut me confirmer que c'est normal (!), quand j'ai compilé mon .a, xcode à  intégré le code de l'autre .a ?
    Je me voyais faire des manips avec lipo mais ça semble inutile.
  • CéroceCéroce Membre, Modérateur
    03:35 modifié #7
    dans 1318253304:

    Je fais pareil, c'est juste pour faire raler Céroce.  >:D ;D


    o:) L'identification précise des dépendances est la voie de la sagesse.  o:)
  • AliGatorAliGator Membre, Modérateur
    03:35 modifié #8
    dans 1318254432:
    A ce propos, il m'est arrivé un truc inattendu : quand j'ai inclu les 2 .a (le mien et l'autre) dans une appli de test, xcode m'a sorti une erreur duplicate entry.
    J'ai supprimé l'autre .a et tout a marché.
    Quelqu'un peut me confirmer que c'est normal (!), quand j'ai compilé mon .a, xcode à  intégré le code de l'autre .a ?
    Je me voyais faire des manips avec lipo mais ça semble inutile.
    Bah oui c'est normal.

    Enfin ça dépend comment est foutue ta librairie .a en fait.
    Si tu as une librairie libA.a et une librairie libB.a qui, comme tu dis "dépend de libA.a", certainement que quand tu compiles libB.a elle inclus dans son code libA.a. C'est le propre des librairies statiques (comparativement aux librairies dynamiques), quand on link avec une librairie statique, on ne fait qu'inclure directement son code compilé dans le produit que l'on link.

    Si tu link une application avec une librairie libX.a, une fois l'appli compilée, tout le code de la librairie libX.a est inclus en dur dans le code de l'appli compilée (tu peux supprimer libX.a l'appli continuera de fonctionner, le code de libX a été copié dans le code de l'app).
    De la même manière si tu link une librairie libB.a avec une librairie libA.a, une fois la librairie B compilée, tout le code de la librairie libA.a est inclus en dur dans le code de la librairie libB que tu viens de produire.
    Et du coup bien sûr si tu link ensuite une application avec cette libB, cette libB contient tout le code de libB... et le code de libA aussi qu'elle a copié quand tu as compilé libB... donc du coup comme il y a déjà  tout le code compilé de libA dans libB il ne faut pas relinker ton appli aussi avec libA, sinon tout le code de libA serait inclus 2 fois (d'où le "duplicate entry"). C'est logique.

    Bien sûr si tu fonctionnais avec des librairies dynamiques, cela ne serait plus vrai, quand on link avec une dylib le code n'est que référencé, pas copié.
  • groumpfgroumpf Membre
    03:35 modifié #9
    Ok merci Ali,
    en fait j'ai du le faire par hasard puisque j'ai intégré la libA dans le projet de la libB alors que les headers auraient suffit j'imagine pour juste compiler la libB (à  condition à  ce moment d'ajouter la libA dans l'application finale).
    En tout cas ça résout un de mes problèmes.
Connectez-vous ou Inscrivez-vous pour répondre.