Где вы размещаете код очистки для подклассов NSDocument? - PullRequest
8 голосов
/ 16 марта 2009

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

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

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

Ответы [ 2 ]

9 голосов
/ 16 марта 2009

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

8 голосов
/ 17 декабря 2012

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

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

В этом случае (на момент написания и если я просто смотрю не туда) документация не так полезна, как могла бы.

Я добавил переопределение 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 . Если у этого подхода есть недостатки или более эффективные способы, пожалуйста, прокомментируйте.

...