Un warning qui me gêne

Eddy58Eddy58 Membre
août 2004 modifié dans API AppKit #1
Je récupère un objet dont je ne connais pas la classe par l'intermédiaire d'une notification.
Si l'objet est de la classe "Classe1" alors j'initialise "objetClasse1".
Puis je récupère le pointeur de l'objet "objet", mais j'obtiens sur cette ligne un warning "assignment from incompatible pointer type".
Ce warning n'empêche pas de faire ce que je veux ensuite, cad utiliser les méthodes accesseurs, mais comment supprimer ce warning ? Il y a une incompatibilité, j'ai surement du me tromper quelque part ou oublier quelque chose non ?

-(void)recuperationObjet:(NSNotification *)notification
{
         NSObject *objet;
         Classe1 *objetClasse1;

objet=notification userInfo] objectForKey:@&quot;Objet&quot;];<br /> if ([objet isKindOfClass:[Classe1 class);
{
objetClasse1=[[Classe1 alloc] init];
objetClasse1=objet;  // Warning : assignment from incompatible pointer type
}
}


.....je voulais mettre ce sujet dans "Les bases", Izostar m'entend-tu ??? ;)

Réponses

  • BruBru Membre
    août 2004 modifié #2
    Euh, c'est pas très beau ce que tu as fait !

    Première chose, quand on ne connait pas la classe d'un object, on ne le référence pas en tant de NSObject, mais en tant que id. Donc remplace ta ligne 3 par
        id object;
    


    Ensuite, ligne 8, tu créés un nouvel object dont tu stockes son pointeur dans la variable objetClasse1. Mais une ligne plus bas, tu écrases ce pointeur par la valeur du pointeur de l'objet que tu as récupéré via le dictionnaire de la notification.

    1 - cela explique le warning, car le compilateur détecte que tu mets un pointeur d'un objet de type X dans une variable pour pointeur de type Y.

    2 - en plus tu provoques un memory leak (une fuite mémoire) car ton objet alloué en ligne 8 ne sera jamais détruit ; pire tu perds le pointeur sur cet objet en ligne 9...

    .
  • muqaddarmuqaddar Administrateur
    10:01 modifié #3
    dans 1091920615:


    .....je voulais mettre ce sujet dans "Les bases", Izostar m'entend-tu ??? ;)


    5/5 mon cher Eddy58 ;-)
  • Eddy58Eddy58 Membre
    10:01 modifié #4
    dans 1091950243:

    Euh, c'est pas très beau ce que tu as fait !

    Première chose, quand on ne connait pas la classe d'un object, on ne le référence pas en tant de NSObject, mais en tant que id. Donc remplace ta ligne 3 par
        id object;
    


    Ensuite, ligne 8, tu créés un nouvel object dont tu stockes son pointeur dans la variable objetClasse1. Mais une ligne plus bas, tu écrases ce pointeur par la valeur du pointeur de l'objet que tu as récupéré via le dictionnaire de la notification.

    1 - cela explique le warning, car le compilateur détecte que tu mets un pointeur d'un objet de type X dans une variable pour pointeur de type Y.

    2 - en plus tu provoques un memory leak (une fuite mémoire) car ton objet alloué en ligne 8 ne sera jamais détruit ; pire tu perds le pointeur sur cet objet en ligne 9...


    En effet c'est pas bô du tout ce que j'ai fait, c'est pour ça que je suis venu ici pour faire éclairer ma lanterne ! :)

    Le fait de mettre un "id objet" résoud tout mes problèmes. J'avais déjà  essayé, mais j'avais mis "id *objet" (horreur !), donc ca ne pouvait pas marcher. C'est bien plus logique ainsi. Plus besoin d'initialiser d'objet inutile et surtout pas en accord avec les normes comme je l'ai fait auparavant.

    void)recuperationObjet:(NSNotification *)notification
    {
       id objet;

       objet=notification userInfo] objectForKey:@&quot;Objet&quot;];<br />   if ([objet isKindOfClass:[Classe1 class);
       {
            // Ici je peux accéder aux méthodes accesseurs de l'objet de classe Classe1 sans problèmes..... :)
       }
    }
  • BruBru Membre
    10:01 modifié #5
    Ta 2ème mouture est (sans flagorneire de ma part) parfaite.

    Bonne continuation.

    Note : écrire id *object n'est pas faux en soi... cela veut simplement dire que tu créés une variable nommée object dont le but sera de stocker un pointeur sur une variable qui elle même contiendra le pointeur d'un objet...
    Berf id object équivaut à  écrire (grosso modo) NSObject **object...

    .
Connectez-vous ou Inscrivez-vous pour répondre.