Un warning qui me gêne
Eddy58
Membre
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:@"Objet"];<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 ???
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:@"Objet"];<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 ???
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
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
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...
.
5/5 mon cher Eddy58 ;-)
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:@"Objet"];<br />   if ([objet isKindOfClass:[Classe1 class);
   {
    // Ici je peux accéder aux méthodes accesseurs de l'objet de classe Classe1 sans problèmes.....
   }
}
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...
.