Domanda

Ho un'applicazione basata su documenti e ho suddiviso in sottocategorie NSDocument e fornito i metodi richiesti, ma il mio documento ha bisogno di una pulizia approfondita (deve eseguire attività esterne ecc.). Qual è il posto migliore dove metterlo? Ho provato alcuni metodi diversi come:

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

Se lo metto in dealloc , a volte viene chiamato e altre volte no (premendo Command + Q sembra bypassare la deallocazione del mio documento), ma è obbligatorio che questo codice venga chiamato senza errore (a meno che il programma non venga chiuso in modo imprevisto).

È stato utile?

Soluzione

Chiedi a ciascun documento di aggiungersi come osservatore nel centro di notifica locale per NSApplicationWillTerminateNotification . Nel suo metodo di notifica, chiama il suo metodo di pulizia (che dovresti anche chiamare da dealloc o close ).

Altri suggerimenti

La risposta corretta qui non si adattava al mio caso d'uso, ma la domanda lo fa. Da qui la risposta extra.

Il mio caso d'uso: chiusura di un documento (che può essere uno dei tanti che sono aperti) ma non chiusura dell'applicazione.

In questo caso (al momento in cui scrivo e, a meno che non stia solo cercando nel posto sbagliato) il documentation non è utile quanto potrebbe essere.

Ho aggiunto un canCloseDocumentWithDelegate: shouldCloseSelector: contextInfo: sovrascrivendo la mia sottoclasse NSDocument e chiamato super al suo interno. La documentazione non dice se è necessario chiamare super, ma un po 'di registrazione mostra che il sistema fornisce un selettore e un contesto. Questo metodo viene chiamato appena prima della chiusura del 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];    
}

C'è qualche utile discussione di questo metodo su CocoaBuilder . Se ci sono aspetti negativi di questo approccio o modi migliori per farlo, si prega di commentare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top