[Résolu] Plantage d'un menu au deuxième appel
odjau
Membre
Bonsoir tout le monde,
je poste alors que j'ai résolu (il me semble correctement) mon problème, car ça pourrait d'autres débutants.
En faisant ce tutorial je me suis confronté au bug suivant :
Lorsque j'appelle la fenêtre Préférences une première fois, tout fonctionne. Lorsque je l'appelle une seconde fois le programme planteavec un EXC_BAD_ACCESS lorsque je clique sur le menu.
Après une recherche sur le forum, je n'ai pas trouvé de solution directe à ce problème, mais en lisant ce fil de discussion je suis parti sur la piste d'une mauvaise gestion de mémoire, et j'ai fini par trouver dans IB l'option Release When Closed dans l'inspecteur d'attributs de ma fenêtre Préférences. Une fois cette option décochée plus de problèmes ::)
Je suis content parce que j'ai résolu mon bug, mais quid de la déallocation de la fenêtre Preférences ?
@+
odjau
je poste alors que j'ai résolu (il me semble correctement) mon problème, car ça pourrait d'autres débutants.
En faisant ce tutorial je me suis confronté au bug suivant :
Lorsque j'appelle la fenêtre Préférences une première fois, tout fonctionne. Lorsque je l'appelle une seconde fois le programme planteavec un EXC_BAD_ACCESS lorsque je clique sur le menu.
Après une recherche sur le forum, je n'ai pas trouvé de solution directe à ce problème, mais en lisant ce fil de discussion je suis parti sur la piste d'une mauvaise gestion de mémoire, et j'ai fini par trouver dans IB l'option Release When Closed dans l'inspecteur d'attributs de ma fenêtre Préférences. Une fois cette option décochée plus de problèmes ::)
Je suis content parce que j'ai résolu mon bug, mais quid de la déallocation de la fenêtre Preférences ?
@+
odjau
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Bizarre.
1) Soit un panel dans MainMenu.nib
Là , le panel est automatiquement chargé comme les autres éléments du nib principal, on relie l'option du menu NewAppli>Préférences à l'action makeKeyAndOrderFront du panel.
Il faut effectivement s'assurer que "Release When Closed" ne soit pas coché car l'action makeKeyAndOrderFront ne réinstancie pas le panel.
2) Soit dans un nib spécial
Là on crée une classe héritant de NSWindowController pour gérer un nib spécifique au panel des préférences, et l'option NewAppli>Préférences est relié à l'IBAction d'un contrôleur général de l'application dont la méthode associée aurait une structure de ce type :
@interface MyGeneralController : NSObject {
PreferencesController * preferencesController;
...
}
-(IBAction) showPreferencesPanel:(id)sender;
@implementation MyGeneralController
-(IBAction) showPreferencesPanel:(id)sender{
if(preferencesController==nil) {
// create preferencesController
}
[preferencesController showWindow:self];
}
Le panel des préférences n'est chargé que si cela est nécessaire.
Quand on a des bugs , et cela arrive ... >:D , on peut utiliser l'option clean targets afin de s'assurer que la nouvelle compilation se fait sur un terrain propre. En effet XCode fait de la compilation séparée (heureusement ! ) ce qui veut dire qu'il ne recompile pas la totalité du code.
Si une partie buggée n'a pas été retouchée lors d'un debugage, il y a peu de chances qu'elle soit recompilée.
Il m'est arrivé même d'avoir à ller jeter le fichier des préférences dans la librairie pour que soit pris en compte mes changements.
Je pense que le fait de recompiler sous XCode 3.0 au lieu de XCode 3.1 a fait automatiquement ce nettoyage.
@+