2009-03-16 2 views
8

У меня есть приложение на основе документов, и я получил подклассы NSDocument и предоставил необходимые методы, но мой документ нуждается в некоторой обширной очистке (необходимо выполнить внешние задачи и т. Д.). Где лучше всего это поставить? Я попробовал несколько различных методов, таких как:Где вы размещаете код очистки для подкласс классов NSDocument?

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

Если я положил его в dealloc, иногда она вызывается и другие времена это (нажатие Command + Q похоже на обход моего документа), но обязательно, чтобы этот код вызывался без fai приманка (если программа неожиданно не прекращается).

ответ

8

Имейте каждый документ, добавляя себя в качестве наблюдателя в местный центр уведомлений для NSApplicationWillTerminateNotification. В методе уведомления вызовите его метод очистки (который вы также должны вызвать от dealloc или close).

8

Правильный ответ здесь не подходит для моего варианта использования, но вопрос делает. Отсюда дополнительный ответ.

Мой прецедент: Закрытие документа (который может быть одним из нескольких открытых), но не закрывает приложение.

В этом случае (в момент написания и если я просто не вхожу в неправильное место) documentation не так полезен, как мог бы быть.

Я добавил canCloseDocumentWithDelegate:shouldCloseSelector:contextInfo: переопределить в моем подклассе NSDocument и назвал super внутри него. В документации не указано, нужно ли вызывать супер, но бит ведения журнала показывает, что система предоставляет селектор и контекст. Этот метод вызывается непосредственно перед закрытием документа.

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

Существует несколько полезных обсуждений этого метода на CocoaBuilder. Если есть недостатки в этом подходе или более эффективные способы сделать это, прокомментируйте.

+2

Я не думаю, что это совершенно правильно: вы должны делать очистку только в ifCloseSelector, потому что shouldCloseSelector только вызывается, если документ готов к закрытию (например, успешно сохранен). Этот метод canClose, который вызывается, не указывает на то, что документ действительно будет закрыт (например, сбой может завершиться сбой). – Joel

Смежные вопросы