[Résolu] Plantage d'un menu au deuxième appel

odjauodjau Membre
16:07 modifié dans API AppKit #1
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

Réponses

  • bdonebdone Membre
    16:07 modifié #2
    J'ai rencontré le même problème que j'ai solutionné en compilant avec xcode 3.0 au lieu de 3.1.
    Bizarre.
  • odjauodjau Membre
    16:07 modifié #3
    ah oui, c'est louche là  ??? ça plombe un peu mon explication. Si quelqu'un à  une idée, je suis preneur ;)
  • Philippe49Philippe49 Membre
    juin 2008 modifié #4
    Deux solutions pour gérer une fenêtre préférences :

    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.
  • Philippe49Philippe49 Membre
    16:07 modifié #5
    dans 1214337625:

    J'ai rencontré le même problème que j'ai solutionné en compilant avec xcode 3.0 au lieu de 3.1.
    Bizarre.


    Quand on a des bugs , et cela arrive ...  B)   >: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.
  • odjauodjau Membre
    16:07 modifié #6
    Merci pour les précisions.

    @+
  • bdonebdone Membre
    16:07 modifié #7
    Merci pour ces explications claires et didactiques.
Connectez-vous ou Inscrivez-vous pour répondre.