Dove si inserisce il codice di pulizia per le sottoclassi di NSDocument?
-
19-08-2019 - |
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).
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.