Warnings intenpestifs

UniXUniX Membre
15:04 modifié dans Vos applications #1
Salut.

J'ai un objet qui a une méthode appellée par plusieurs WindowController.
Pour savoir qui l'appelle, ma méthode est du type :
- (void)faireUneBelleAction:(id)sender


Dans cette méthode, je fais appel à  des NSControl du WindowController appelant avec des choses du style :
[[sender monControl] stringValue]


Or, comme l'appelant est du type id dans ma méthode, le compilo me renvoie un warning
warning : no -monControl method found


Comment faire pour m'en sortir pour virer ces warnings ???

Réponses

  • BruBru Membre
    mai 2006 modifié #2
    Il faut que tu "cast" sender en fonction de sa classe...

    Mais, warning ne veut pas dire erreur, ne t'en inquiètes donc pas.

    .
  • UniXUniX Membre
    15:04 modifié #3
    Ouais mais je ne peux pas la caster, car l'appelant de a méthode peux être d'une classe ou d'une autre .... En fait, 2 WindowController contenant les mêmes NSControl peuvent l'appeler.

    Je sais que les warnings ne sont pas un pb, mais c'est pour essayer de ne pas se trimbaler 20 ou 30 warnings ..... ;D
  • BruBru Membre
    15:04 modifié #4
    dans 1147101407:

    En fait, 2 WindowController contenant les mêmes NSControl peuvent l'appeler.


    Et donc...?

    [[(NSWindowController *)sender monControl] stringValue]
    


    En plus, le cast (du moins au niveau des pointeurs) n'a aucune signification au niveau de la compilation même, il ne sert qu'à  préciser que le pointeur manié est de d'un type précis (même s'il est d'un autre type).

    Que l'objet passé dans sender soit de classe TRUCMUCHE ou MACHINCHOSE, cela n'a aucune importance dès lors que l'une ou l'autre des classes, au runtime, répondent au message faireUneBelleAction.
    Donc, si tu "cast" sender en TRUCMUCHE, mais que l'objet soit MACHINCHOSE :
    1.  ça ne plantera pas l'appli (les 2 classes répondent au message),
    2. ça ne fera pas de warning (le compilo détecte bien que TRUCMUCHE implémente la méthode).

    .
  • UniXUniX Membre
    15:04 modifié #5
    dans 1147102158:

    Que l'objet passé dans sender soit de classe TRUCMUCHE ou MACHINCHOSE, cela n'a aucune importance dès lors que l'une ou l'autre des classes, au runtime, répondent au message faireUneBelleAction.
    Donc, si tu "cast" sender en TRUCMUCHE, mais que l'objet soit MACHINCHOSE :
    1.  ça ne plantera pas l'appli (les 2 classes répondent au message),
    2. ça ne fera pas de warning (le compilo détecte bien que TRUCMUCHE implémente la méthode).


    C'est bon à  savoir.
    Il me reste quand même un warning, car si je caste sender en TRUCMUCHE et que je passe un objet MACHINCHOSE en argument, il me dit que ce n'est pas le bon type ....

    Mais bon, j'ai troqué 20 warnings contre 1 , c'est mieux ...!

    Merci en tous cas.
  • mai 2006 modifié #6
    Si tu as un warning alors que ton sender est défini comme étant id, une des causes fréquentes est que le compilo ne trouve aucune méthode correspondante dans les classes importées. Si dans controller.h (Controller étant la classe qui implémente maBelleAction) tu fais juste #import <Cocoa/Cocoa.h>, aucun autre import dans le .m et que "monControl" est implémenté dans une classe maison, il est tout à  fait normal de se choper un warning. Si tu castes en NSWindowController, le warning est normal aussi, NSWindowController n'implémentant pas monControl (à  moins d'avoir fait une catégorie qui l'implémente et importé le header correspondant).

    Donc tout ce que tu as à  faire est de faire:
    #import "UnDesControllerPerso.h" (dans le .m par exemple) pour que le compilo sache qu'une telle méthode existe et donc ne beugle pas, le cast n'est pas nécessaire si sender est de type id.

    Les seules fois que j'ai du caster un objet de type id (lorsque les imports sont fait correctement) c'est lorsque j'utilise une méthode qui existe dans plusieurs classes et ayant la meme signature, mais ayant des arguments de types différents et/ou des types de renvoi de type différent (genre -(NSString*)type et -(NSCellType)type - NSCellType étant assimilable à  un int). Mais bien entendu dans ce cas le le message d'erreur est différent.
  • UniXUniX Membre
    15:04 modifié #7
    Ouais.

    Super, merci Bru et Renaud.
Connectez-vous ou Inscrivez-vous pour répondre.