2009-03-16 8 views
8

Tengo una aplicación basada en documentos y he subclasificado NSDocument y proporcioné los métodos necesarios, pero mi documento necesita una limpieza exhaustiva (necesita ejecutar tareas externas, etc.). ¿Dónde está el mejor lugar para poner esto? He probado un par de métodos diferentes, tales como:¿Dónde coloca el código de limpieza para las subclases de NSDocument?

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

Si lo pongo en dealloc, a veces es llamado y otras veces no (al presionar Comando + Q parece pasar por alto la desasignación de mi documento), pero es obligatorio llamar a este código sin fai señuelo (a menos que el programa termine inesperadamente).

Respuesta

8

Haga que cada documento se agregue como un observador en el centro de notificaciones local para NSApplicationWillTerminateNotification. En su método de notificación, llame a su método de limpieza (que también debe llamar desde dealloc o close).

8

La respuesta correcta aquí no se ajustaba a mi caso de uso, pero la pregunta sí. De ahí la respuesta extra.

Mi caso de uso: cerrando un documento (que puede ser uno de varios que están abiertos) pero sin cerrar la aplicación.

En este caso (al momento de escribir y a menos que solo esté buscando en el lugar incorrecto) el documentation no es tan útil como podría ser.

Agregué un canCloseDocumentWithDelegate:shouldCloseSelector:contextInfo: anulación en mi subclase NSDocument y llamé super dentro de él. La documentación no indica si debe llamar a súper, pero un poco de registro muestra que el sistema proporciona un selector y un contexto. Este método se llama justo antes de que se cierre el documento.

- (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];  
} 

Hay alguna discusión útil de este método en CocoaBuilder. Si hay desventajas en este enfoque o mejores formas de hacerlo, por favor comente.

+2

No creo que esto sea del todo correcto: solo debe realizar la limpieza en el shouldCloseSelector porque solo se llama a shouldCloseSelector si el documento está listo para cerrarse (por ejemplo, se guardó correctamente). Este método canClose que se llama no indica que el documento realmente se cerrará (por ejemplo, el guardado podría fallar). – Joel

Cuestiones relacionadas