[Résolu] Comment tuer un zombie?

berfisberfis Membre
novembre 2013 modifié dans API AppKit #1

Bonsoir,


 


Dans une application avec documents, je souhaite répercuter immédiatement une modification des préférences.


 


NSDocumentSubclass:


@property  (weak) IBOutlet NSUserDefaultsController *udc;


 


Quand le document s'ouvre:


 



// - (void) windowControllerDidLoadNib:(NSWindowController *)aController {
// ...
[_udc addObserver:self forKeyPath:@values.showID options:0 context:nil ];
...

Quand le document se ferme:




// - (void)windowWillClose:(NSNotification *)notification
// ...
[_udc removeObserver:self forKeyPath:@values.showID ];
...

Malheureusement, si je clique sur l'option des préférences alors que la fenêtre du document a été refermée, tout saute. Un message a été envoyé à  un zombie de NSDocumentSubclass.


 


Comment faire mieux, ou différemment, si je veux que le document soit abonné aux modifications des préférences, et désabonné à  sa fermeture?


 


Merci d'avance.


Mots clés:

Réponses

  • CéroceCéroce Membre, Modérateur
    Ce que tu fais est bon dans le principe: il faut absolument que l'observateur arrête l'observation avant d'être désalloué.

    Tu as sans doute un problème de cheminement temporel: windowWillClose: n'est pas appelée, ou n'est pas appelée au bon moment. Mets des points d'arrêt pour voir dans quel ordre cela se déroule.
  • On ne tue pas un zombie, il est déjà  mort!


    J'allais donner le même conseil que Céroce: Points d'arrêt pour voir l'ordre d'exécution.


    Peut être faire l'arrêt de l'observateur dans un windowShouldClose qui normalement apparaà®t avant le windowWillClose.


  • Il faut utiliser la méthode close de NSDocument:



    - (void)close
    {
    ...
    [super close]
    }
  • berfisberfis Membre
    novembre 2013 modifié #5

    close


    Closes all windows owned by the receiver and removes the receiver from the list of documents maintained by the document controller, which consequently releases it.


    - (void)close

    Discussion

    This method closes the document immediately, without asking users if they want to save the document. This method may not always be called.




    Je cours le risque ?


  • MalaMala Membre, Modérateur


    On ne tue pas un zombie, il est déjà  mort!




    Grillé! :D


     


    Sinon, je pense que le "This method may not always be called." est lié au fait que si tu quittes l'appli le close n'est pas spécialement appelé par exemple. Cela ne devrait avoir aucun impact pour toi. Le mieux reste de tester. Tu seras vite fixé.

  • berfisberfis Membre
    novembre 2013 modifié #7

    Merci pour les réponses. J'ai changé le code d'origine en:



    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(defaultsChanged:) name:NSUserDefaultsDidChangeNotification object:nil];

    Je ne sais pas, peut-être était-ce l'inscription auprès du NSUserDefaultsController qui posait problème... J'ai donc inscrit le document au centre de notifications, et pour faire bonne mesure:



    - (void) close
    {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [super close];
    }

    d'après le conseil de mpergand.


     


    D'accord, techniquement parlant, un zombie est déjà  mort. Mais il semble que grâce a vous, je lui ai éclaté la tronche. En tout cas Instruments ne le détecte plus.


     


    Merci!


Connectez-vous ou Inscrivez-vous pour répondre.