Créer deux instance d'une classe
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:
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
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 'NSInvalidArgumentException', reason: '*** -[UIImageView objectForKey:]: unrecognized selector sent to instance 0x54aa00'<br />Stack: (<br /> 2466173195,<br /> 2521112123,<br /> 2466202378,<br /> 2466195724,<br /> 2466195922,<br /> 2465488965,<br /> 816211112,<br /> 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
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
*** -[UIImageView objectForKey:]: unrecognized selector sent to instance 0x54aa00
UIImageView ne répond pas au message objectForKey:
Ce qui est bizzare, c'est que je n'utilise aucun imageView dans ces 2 controleurs.
ou
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.
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:
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:
ou bien:
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.
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.
Un peu de lecture...
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.