Créer deux instance d'une classe

KassKass Membre
06:26 modifié dans API UIKit #1
Bonjour à  tous,

J'ai une vue dans laquelle j'ai trois boutons différents. On va les appeller Bouton1, Bouton2 et Bouton3.

Lorsque l'on clique sur l'un de ces boutons, cela va créer une instance d'un ViewController. Donc je me retrouve avec 3 instances différentes d'un même viewController.
A chaques fois cela doit afficher un tableView affichant le contenu d'un plist.
Dans la methode loadView du viewContorller il y a une boucle if qui charge donc un plist différent suivant le bouton sélectionné.

Lorsque je lance mon application, et que je sélectionne un des boutons, ma vue sera toujours affichée correctement. Mais lorsque je reviens a la vue ou j'ai le choix avec les trois boutons, et que je clique sur un second bouton, là  le programme plante.

Voici le message:

<br />*** -[UIImageView objectForKey:]: unrecognized selector sent to instance 0x54aa00<br />*** Terminating app due to uncaught exception &#39;NSInvalidArgumentException&#39;, reason: &#39;*** -[UIImageView objectForKey:]: unrecognized selector sent to instance 0x54aa00&#39;<br />Stack: (<br />&nbsp; &nbsp; 2466173195,<br />&nbsp; &nbsp; 2521112123,<br />&nbsp; &nbsp; 2466202378,<br />&nbsp; &nbsp; 2466195724,<br />&nbsp; &nbsp; 2466195922,<br />&nbsp; &nbsp; 2465488965,<br />&nbsp; &nbsp; 816211112,<br />&nbsp; &nbsp; 816276360,<br /><br />


L'affichage de l'instance de mon viewController s'effectue a chaques fois par:
[self.view addSubview:[countryController view]];

Le debugger affiche l'erreur je crois a ce niveau là .

ça fait plus d'une semaine que je teste tout, mais ça ne marche pas. Est-ce que quelqu'un aurait une petite idée?

merci à  vous

Réponses

  • Philippe49Philippe49 Membre
    06:26 modifié #2
    Tout me semble résumé dans le message  d'erreur

    *** -[UIImageView objectForKey:]: unrecognized selector sent to instance 0x54aa00

    UIImageView ne répond pas au message objectForKey:
  • KassKass Membre
    06:26 modifié #3
    oui ce message change d'ailleurs souvent. Ce n'est pas toujours UIImageView.
    Ce qui est bizzare, c'est que je n'utilise aucun imageView dans ces 2 controleurs.
  • KassKass Membre
    06:26 modifié #4
    Voici les autres messages d'erreurs qui interviennent (sans aucun changement dans le code source):

    <br />*** -[CALayer objectForKey:]: unrecognized selector sent to instance 0x54aa20<br />*** Terminating app due to uncaught exception &#39;NSInvalidArgumentException&#39;, reason: &#39;*** -[CALayer objectForKey:]: unrecognized selector sent to instance 0x54aa20&#39;<br />Stack: (<br />
    


    ou

    <br />*** -[CALayerArray objectForKey:]: unrecognized selector sent to instance 0x54b6c0<br />*** Terminating app due to uncaught exception &#39;NSInvalidArgumentException&#39;, reason: &#39;*** -[CALayerArray objectForKey:]: unrecognized selector sent to instance 0x54b6c0&#39;<br />Stack: (<br />
    
  • Philippe49Philippe49 Membre
    mars 2009 modifié #5
    dans 1236638153:

    oui ce message change d'ailleurs souvent. Ce n'est pas toujours UIImageView.
    Ce qui est bizzare, c'est que je n'utilise aucun imageView dans ces 2 controleurs.


    Je pencherais tout d'abord sur un problème de retain sur les countryController.
    Un objet a priori dans le countryController étant désalloué , mais continuant à  pointer sur une zone mémoire tant que l'on n'a pas fait objet=nil ,  pointe alors sur des objets aléatoires.
    Vérifie la gestion mémoire des objets définis dans ces CountryController.
  • KassKass Membre
    06:26 modifié #6
    Je crois avoir trouvé !!
    je faisais un release sur un path, alors qu'il n'y avait pas de alloc !
    et maintenant ça a l'air de marcher en l'enlevant.

    Merci Philippe49 une fois de plus pour ton aide précieuse!




    J'ai juste quelques questions à  propos de la gestion de la mémoire afin de faire moins d'erreurs dans le futur.

    1- Il y a besoin d'effectuer un release d'une variable que lorsque qu'il y a eu un alloc avant?

    Par ex:

    <br />NSString *monString = [[NSString alloc] initWithFormat:&quot;MonString!&quot;];<br />monStringGlobal = monString;<br />[monString release];<br />
    


    2- A quel moment utilise-t-on retain plutôt que alloc?

    3- Dans la methode dealloc on doit effectuer un release de toutes les variables globales? même des IBOutlet?

    4 - Si on a une variable globale, quel est le meilleur moyen pour lui donner une valeur?
    On va prendre exemple sur un NSString nommé monStringGlobal en variable globale:

    <br />NSString *monString = [[NSString alloc] initWithFormat:&quot;MonString!&quot;];<br />monStringGlobal = monString;<br />[monString release];<br />
    


    ou bien:

    <br />monStringGlobal = [[NSString alloc] initWithFormat:&quot;MonString!&quot;];<br />
    


    Voilà  pour les questions que je me pose en ce moment. Il est vrai que je ne maà®trise pas encore énormément de choses niveau gestion de la mémoire. Le principe est très logique mais l'application, pas toujours simple lorsque l'on mélange un peu tout comme moi.
  • CeetixCeetix Membre
    06:26 modifié #7
    1 - Oui
    2 - J'aimerai savoir aussi
    3 - Oui, mais pas des IBOutlets, je crois pas...
    4 - Oublie pas le @";", et moi je préfère faire ton dernier code.
  • NoNo Membre
    mars 2009 modifié #9
    1. oui, mais il y a aussi copy et new.

    2. on utilise retain lorsqu'on va utiliser un objet qu'on a pas créé soi-même (donc ni par alloc/init, ni copy, ni new).
    Juste avant de l'utiliser, on fait un retain. Puis quand on a fini avec lui, on fait un release.
    Comme ça, on est sûr que pendant l'utilisation de l'objet, il ne sera pas supprimé de la mémoire dans une autre partie du programme.
    Donc, c'est soit alloc/init, soit retain, jamais les 2 (car inutile).

    3. c'est quoi une variable globale ?
    Les IBOutlets sont des variables d'instance. As tu créé les objets pointés par IBOutlets (donc as tu fait un alloc/init, un copy ou un new) ?
    Non... donc t'as pas à  t'occuper de leur suppression. donc pas de release.

    4. pour les strings, pas besoin de "variable globales".
    Au pire, un monStringGlobal=@MonString!; suffit amplement.
    De plus ton code est plantogène au possible.


    En résumé, si tu créés ton objet (alloc/init, copy ou new), alors tu as la charge de le supprimer (par un release).
    Si tu n'as pas créé l'objet (par exemple, tu le reçois en paramètre), et tu as besoin de le garder en mémoire un certain temps, alors tu fais un retain. Quand tu en a plus besoin, tu fais un release.
  • KassKass Membre
    06:26 modifié #10
    Merci beaucoup à  tous pour vos réponses, cela va beaucoup m'aider !
Connectez-vous ou Inscrivez-vous pour répondre.