2009-03-16 3 views
8

J'ai une application basée sur le document et j'ai sous-classé NSDocument et fourni les méthodes requises, mais mon document a besoin d'un nettoyage approfondi (doit exécuter des tâches externes, etc.). Où est le meilleur endroit pour mettre ça? J'ai essayé quelques différentes méthodes telles que:Où mettez-vous le code de nettoyage pour les sous-classes NSDocument?

  • close
  • close:
  • canCloseDocumentWithDelegate:shouldCloseSelector:contextInfo
  • dealloc

Si je le mets dans dealloc, parfois, il est appelé et d'autres fois il ne pas (en appuyant sur Commande + Q semble contourner le désallocation de mon document), mais il est obligatoire que ce code soit appelé sans fai leurre (sauf si le programme se termine de manière inattendue).

Répondre

8

Chaque document doit être ajouté en tant qu'observateur dans le centre de notification local pour NSApplicationWillTerminateNotification. Dans sa méthode de notification, appelez sa méthode de nettoyage (que vous devez également appeler depuis dealloc ou close).

8

La bonne réponse ici ne correspondait pas à mon cas d'utilisation, mais la question est. D'où la réponse supplémentaire.

Mon cas d'utilisation: fermeture d'un document (qui peut être l'un des documents ouverts) mais ne ferme pas l'application.

Dans ce cas (au moment de l'écriture et à moins que je ne cherche juste au mauvais endroit) le documentation n'est pas aussi utile qu'il pourrait l'être.

J'ai ajouté un override canCloseDocumentWithDelegate:shouldCloseSelector:contextInfo: dans ma sous-classe NSDocument et je l'ai appelé super. La documentation ne dit pas si vous devez appeler super, mais un peu de journalisation montre que le système fournit un sélecteur et un contexte. Cette méthode est appelée juste avant la fermeture du document.

- (void) canCloseDocumentWithDelegate:(id)delegate shouldCloseSelector:(SEL)shouldCloseSelector contextInfo:(void *)contextInfo; 
{ 
    if ([self pdfController]) 
    { 
     [[[self pdfController] window] close]; 
     [self setPdfController: nil]; 
    } 

    [super canCloseDocumentWithDelegate:delegate shouldCloseSelector: shouldCloseSelector contextInfo: contextInfo];  
} 

Il existe une discussion utile de cette méthode sur CocoaBuilder. S'il y a des inconvénients à cette approche ou de meilleures façons de le faire, veuillez commenter.

+2

Je ne pense pas que ce soit entièrement correct: vous ne devez effectuer le nettoyage que dans le paramètre shouldCloseSelector, car le paramètre shouldCloseSelector n'est appelé que si le document est prêt à être fermé (par exemple enregistré avec succès). Cette méthode canClose appelée ne signifie pas que le document sera fermé (par exemple, l'enregistrement peut échouer). – Joel

Questions connexes