NSDocument подкласс "закрыть" метод вызывается дважды - PullRequest
3 голосов
/ 12 апреля 2011

У меня есть основанное на документе приложение Какао, которое подклассов NSDocument как MyDocument.Каждый MyDocument управляет отдельным фоновым процессом (как NSTask).Я хочу убедиться, что NSTask завершается при закрытии соответствующего MyDocument или при завершении всего приложения.

Для последнего я заставляю документ соблюдать NSApplicationWillTerminateNotification. Для первого я переопределяюclose метод:

-(void)close {
    // Cleanup code here
    [super close];
}

(Кстати, я не могу поместить код очистки в метод dealloc, так как проект GC'd.)

Проблема заключается в следующем: Если я открою MyDocument, внесу несохраненные изменения, а затем нажму cmd-Q, метод close будет вызываться дважды .От отладчика цепочка вызовов: [MyDocument close] вызывает [NSDocument close], что вызывает [NSWindowController _windowDidClose], что снова вызывает [MyDocument close].(После этого вызова приложение закрывается).

Это ожидаемое поведение?Если это так, есть ли лучший способ освободить ресурсы для конкретных документов?Или я должен просто сделать close безопасным для многократного запуска?

1 Ответ

1 голос
/ 09 апреля 2013

Мне кажется, я видел сообщение в списке рассылки cocoadev, в котором говорится, что на данный момент это нормальное поведение для фреймворков (но оно может измениться в будущем). Вы должны сделать свой метод -close достаточно надежным для обработки нескольких вызовов, поскольку AppKit не дает никаких гарантий, что он будет вызываться только один раз.

Я не думаю, что вам нужно заботиться о NSApplicationWillTerminateNotification, поскольку, если я правильно понимаю, задачи будут автоматически завершены, когда ваше приложение тоже. Кроме того, если вы поддерживаете внезапное завершение, ваше приложение может быть уничтожено без уведомления / уведомления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...