[Résolu] Comment tuer un zombie?
berfis
Membre
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:
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
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:
Je cours le risque ?
Grillé!
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é.
Merci pour les réponses. J'ai changé le code d'origine en:
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:
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!