Question

J'ai une application basée sur les documents. J'ai fourni les méthodes requises, mais code NSDocument , mais mon document nécessite un nettoyage en profondeur (nécessité d'exécuter des tâches externes, etc.). Où est le meilleur endroit pour mettre ça? J'ai essayé différentes méthodes telles que:

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

Si je le mets dans dealloc , il est parfois appelé, mais pas toujours (appuyer sur Commande + Q semble contourner la désallocation de mon document), mais il est obligatoire que ce code soit appelé sans échec (sauf si le programme se termine inopinément).

Était-ce utile?

La solution

Demandez à chaque document de s'ajouter 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 à partir de dealloc ou close ).

Autres conseils

La réponse correcte ne correspond pas à mon cas d'utilisation, mais la question l'est. D'où la réponse supplémentaire.

Mon cas d'utilisation: la fermeture d'un document (l'un des nombreux documents ouverts), mais pas la fermeture de l'application.

Dans ce cas (au moment de la rédaction de l'article et à moins que je ne regarde au mauvais endroit), le Le document n'est pas aussi utile qu'il pourrait l'être.

J'ai ajouté un canCloseDocumentWithDelegate: shouldCloseSelector: contextInfo: dans ma sous-classe NSDocument et appelé super en son sein. La documentation n'indique pas si vous devez appeler super, mais un peu de journalisation indique 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];    
}

Cette CocoaBuilder contient des informations utiles sur cette méthode. S'il y a des inconvénients à cette approche ou de meilleures façons de le faire, veuillez commenter.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top