Partager un symbole entre deux bundles

damdamdamdam Membre
03:49 modifié dans API AppKit #1
Bonjour tout le monde.

Je commence à  bien avancer sur mon programme, mais j'ai un souci de débutant et Google me donne rien.

Mon programme contient des threads, un client HTTP, deux modèles CoreData (et pas encore d'interface graphique :)) Je vais avoir besoin de pas mal de sites internet, donc pour chaque site, j'ai un plugin (NSBundle) qui est chargé dynamiquement. J'ai mon protocole, un système de notification : l'appli demande aux plugins des infos et ces derniers répondent via des notifications quand ils ont ces informations. So far, so good.

Le problème que j'ai est de partager le nom de mes notifications. Je les déclarent sous forme
extern NSString * const MonAppliActionDidFinishNotification
dans mon ActionProtocol.h et
NSString * const MonAppliActionDidFinishNotification = @"MonAppliActionDidFinish"
ailleurs dans mon application (disons PluginLoader.m).
Je ne connais pas la bonne syntaxe pour partager ces symboles entre plusieurs bundles. J'ai soit des erreurs de "duplicates symbols" soit des erreurs de type "non_lazy_ptr not found". Ou alors, mon système de notification fonctionne, mais la notification envoyée par le bundle est une chaine vide (confirmé par le debugger) donc l'appli principale ne les "voit" pas. Quand je mets une chaine en dur des deux cotés, tout fonctionne correctement.

Est-ce que quelqu'un connait l'incatation magique ?

Merci d'avance

Réponses

  • AliGatorAliGator Membre, Modérateur
    03:49 modifié #2
    Salut DamDam.

    Je ne suis pas sûr que tu puisses faire ce que tu veux avec un extern NSString. En effet comme tu as pu le voir, seule la déclaration de ton "extern NSString* const machin" se trouvera dans le .h, donc dans ton interface/API utilisée pour tes plugins et ton pluginLoader, mais pas sa valeur qui doit être elle spécifiée dans le .m (ou .c)...
    Donc si fais comme ça tu risques de devoir définir la valeur de ta NSString const à  la fois dans ton PluginLoader et dans chacun de tes NSBundle, ce qui enlève le gros intérêt du truc, si j'ai tout suivi de ce que tu veux faire.


    Pour moi la solution la plus simple c'est tout bêtement d'utiliser un #define :
    #define MonAppliActionDidFinishNotification @"MonAppliActionDidFinish"
    
    que tu mets dans ton ActionProtocol.h, et comme lui est #importé dans ton PluginLoader ainsi que dans tes plugins/NSBundle si j'ai tout suivi, tu retrouveras ta constante / ton nom de notification partout où ça te sera utile ;)
  • zoczoc Membre
    03:49 modifié #3
    La seule solution, c'est de faire un framework (ou une librairie dynamique) qui exporte les symboles, et de linker tous les bundles avec ce framework...

    Un peu overkill juste pour éviter de dupliquer quelques chaines...

    Je pense que dans ce cas la solution d'AliGator est la plus adaptée.
  • damdamdamdam Membre
    03:49 modifié #4
    dans 1242435133:

    Salut DamDam.

    Je ne suis pas sûr que tu puisses faire ce que tu veux avec un extern NSString. En effet comme tu as pu le voir, seule la déclaration de ton "extern NSString* const machin" se trouvera dans le .h, donc dans ton interface/API utilisée pour tes plugins et ton pluginLoader, mais pas sa valeur qui doit être elle spécifiée dans le .m (ou .c)...
    Donc si fais comme ça tu risques de devoir définir la valeur de ta NSString const à  la fois dans ton PluginLoader et dans chacun de tes NSBundle, ce qui enlève le gros intérêt du truc, si j'ai tout suivi de ce que tu veux faire.


    Pour moi la solution la plus simple c'est tout bêtement d'utiliser un #define :
    #define MonAppliActionDidFinishNotification @"MonAppliActionDidFinish"
    
    que tu mets dans ton ActionProtocol.h, et comme lui est #importé dans ton PluginLoader ainsi que dans tes plugins/NSBundle si j'ai tout suivi, tu retrouveras ta constante / ton nom de notification partout où ça te sera utile ;)


    OK. Parfait. J'ai pas encore testé mais j'ai pigé le truc. Je pensais que le runtime Objective-C permettait la résolution dynamique des symboles de la même manière que les messages.

    Et Zoc, la solution du framework est envisageable dans un deuxième temps. J'aimerais qu'il soit hyper simple d'écrire des plugins, et par gentillesse et nécessité, j'aimerais proposer un système de plugins qui contienne toutes les fonctions de base nécessaires (client HTTP, cache HTTP, parser XML, pool de threads, etc)

    Merci à  vous deux. Je m'y recolle :)
Connectez-vous ou Inscrivez-vous pour répondre.