Problème de callBack en passant en mode ARC

Bonjour,


J'ai comme projet d'actualiser un (vieux) code avec l'ARC, il ne me reste plus qu'une erreur.


Ce code mélange du C++ et de l'objective C.


Le délire c'est que j'utilise un callback que j'ai appelé mCallback pour allez cherchez des informations dans une fonction "alert".


J'ai défini mCallback en tant qu'objet "id".


Ma fonction "alert" est défini dans un fichier en c++ quand je veux utiliser dans un autre fichier mais également en C++:


 


if ([mCallBack respondsToSelector:@selector(alert:)]) {


                NSDictionary* info;


                info = [[NSDictionary alloc] initWithObjectsAndKeys:


                        @blah@blah


                        [NSNumber numberWithInt:channelSelect], @channel, nil ];


                [mCallback alert:info];


 


j'ai comme message d'erreur "NO KNOW INSTANCE METHOD FOR SELECTOR "ALERT"


 


 


Réponses

  • AliGatorAliGator Membre, Modérateur
    juin 2013 modifié #2
    Elle est déclarée comment cette méthode -alert: dans son .h ?
  • rouvrouv Membre

    - (void) alert : (NSDictionnary*) dict;


  • AliGatorAliGator Membre, Modérateur
    Ouais nan mais d'accord, mais où, dans quelle @interface, #importé comment, #implémenté où... ?
    C'est un peu léger comme réponse ^^

    Je vois d'ailleurs que tu es nouveau, je t'invite à  aller te présenter dans la section "Présentation des Membres" du forum pour qu'on en sache un peu plus sur toi, ton background, ton niveau, ton expérience... qu'on ne t'explique pas le B-A-BA si tu le connais déjà  ou à  l'inverse qu'on ne te parle pas chinois si tu débutes.
  • rouvrouv Membre

    Alors c'est un peu compliqué enfin du moins pour moi,


    Mais la fonction alert est implémenté dans Un objet (que l'on va appeler A pour simplifier)


    Cette objet hérite de NSObject, avec un .h et un .mm on implémente cette méthode que dans le .mm (je crois que c'est pour la rendre privée)

    Puis l'autre objet a également un .h et .mm, j'implémente le callback avec id dans le .h et apres dans le .mm j'insere le code ci dessus.

    Avant que je convertisse mon code en ARC ça marché mais maintenant je ne peux plus.

    En fait la l'objet A est situé bien plus haut dans la hierarchie, ce qui m'empeche de l'importer dans le nouvel objet. Ce matin je pars sur la piste des protocoles.


  • rouvrouv Membre

    J'ai trouvé la solution, 


     


    dans le B .h 


    @protocol ;Palert

     


    - (void)alert:(NSDictionary*) dict;


    - (BOOL)respondsToSelector:(SEL)aSelector;


     


    @end


     

     

    et puis lors de ma declaration id mCallBack

    je fais maintenant id <Paelert> mCallBack,

     

    Voila merci pour ton aide et désolé du dérangement !

  • AliGatorAliGator Membre, Modérateur
    Pas une bonne idée de déclarer respondsToSelector toi-même dans le protocole alors que ce n'est pas une méthode que tu as déclarée et écrite toi-même.
    Faire plutôt se conformer ton protocole au protocole <NSObject>, c'est lui qui fournit les déclarations de ces méthodes.
    @protocol PAlert <NSObject>
    - (void)alert:(NSDictionary*) dict;
    @end
    Après comme j'ai du mal à  comprendre tes explications sur ton architecture et organisation de ton code, je ne suis pas sûr qu'un @protocol soit la solution la plus adaptée à  ton problème. Si tu avais déjà  déclaré la méthode "-alert:" dans l'@interface de ta classe, et #importé cette interface, il ne devrait pas y avoir de raison pour que le compilateur se plaigne de ne pas connaà®tre le @selector associé, donc il ne devrait pas être nécessaire de faire un @protocol juste pour ça...

    PS : Merci à  l'avenir d'utiliser les balises CODE dans ton message (tu as même un bouton dans la barre de rédaction de tes messages pour les insérer si tu trouves ça plus pratique) pour formatter ton code proprement et le rendre plus lisible (je t'invite même à  éditer tes messages existants pour rajouter cette balise autour de ton code)
Connectez-vous ou Inscrivez-vous pour répondre.