2009-03-16 23 views
8

Mam aplikację opartą na dokumentach i mam podkategorię NSDocument i pod warunkiem wymaganych metod, ale mój dokument wymaga rozległego czyszczenia (wymaga uruchomienia zadań zewnętrznych itp.). Gdzie jest najlepsze miejsce na umieszczenie tego? Próbowałem kilka różnych metod, takich jak:Gdzie umieszczasz kod oczyszczania dla pod-klas NSDocument?

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

Jeśli mogę umieścić go w dealloc, czasami robi zwanych a innym razem nie (naciśnięcie klawisza Command + Q omija dezalokację mojego dokumentu), ale jest obowiązkowe, aby ten kod był wywoływany bez użycia fai przynęta (chyba że program niespodziewanie się zakończy).

Odpowiedz

8

Każdy dokument jest wyświetlany jako obserwator w lokalnym centrum powiadomień pod numerem NSApplicationWillTerminateNotification. W swojej metodzie powiadamiania wywołaj metodę oczyszczania (którą powinieneś również wywołać z dealloc lub close).

8

Poprawna odpowiedź tutaj nie pasuje do mojego przypadku użycia, ale pytanie to. Stąd dodatkowa odpowiedź.

Mój przypadek użycia: zamykanie dokumentu (który może być jednym z kilku otwartych), ale nie zamykanie aplikacji.

W tym przypadku (w momencie pisania i chyba tylko szukam w niewłaściwym miejscu) documentation nie jest tak pomocne, jak mogłoby być.

Dodałem nadpisanie canCloseDocumentWithDelegate:shouldCloseSelector:contextInfo: w mojej podklasie NSDocument i wywołałem w nim super. Dokumentacja nie mówi, czy musisz zadzwonić super, ale trochę logowania pokazuje, że system zapewnia selektor i kontekst. Ta metoda jest wywoływana tuż przed zamknięciem dokumentu.

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

Istnieje kilka przydatnych dyskusji na temat tej metody na CocoaBuilder. Jeśli istnieje podejrzenie tego podejścia lub lepsze sposoby robienia tego, prosimy o komentarz.

+2

Nie sądzę, że jest to całkowicie poprawne: należy wykonać czyszczenie tylko w obiekcie shouldCloseSelector, ponieważ komenda shouldCloseSelector jest wywoływana tylko wtedy, gdy dokument jest gotowy do zamknięcia (na przykład pomyślnie zapisany). Ta metoda pobrania metody canClose nie oznacza, że ​​dokument zostanie faktycznie zamknięty (np. Zapis może się nie powieść). – Joel