Pregunta

Tengo una aplicación basada en documentos y subclasifiqué NSDocument y proporcioné los métodos requeridos, pero mi documento necesita una limpieza exhaustiva (necesita ejecutar tareas externas, etc.). ¿Dónde está el mejor lugar para poner esto? He probado algunos métodos diferentes como:

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

Si lo pongo en dealloc , a veces se llama y otras veces no (presionando Comando + Q parece omitir la desasignación de mi documento), pero es obligatorio que este código se llame sin falla (a menos que el programa finalice inesperadamente).

¿Fue útil?

Solución

Haga que cada documento se agregue como 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 ).

Otros consejos

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: cerrar un documento (que puede ser uno de varios que están abiertos) pero no cerrar la aplicación.

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

Agregué un canCloseDocumentWithDelegate: shouldCloseSelector: contextInfo: override en mi subclase NSDocument y llamé super dentro de él. La documentación no dice si debe llamar a super, 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 una discusión útil sobre este método en CocoaBuilder . Si hay inconvenientes en este enfoque o mejores formas de hacerlo, comente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top