8

我有一个基于文档的应用程序,我已经分类NSDocument并提供了所需的方法,但是我的文档需要进行一些广泛的清理(需要运行外部任务等)。把这个放在哪里最好?我尝试了几种不同的方法,例如:

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

如果我把它放进去dealloc,有时它会被调用,而有时它不会(按 Command+Q 似乎绕过了我的文档的释放),但是必须在没有失败的情况下调用此代码(除非程序意外终止)。

4

2 回答 2

9

让每个文档将自己添加为本地通知中心的观察者NSApplicationWillTerminateNotification。在它的通知方法中,调用它的清理方法(你也应该从deallocor调用它close)。

于 2009-03-16T04:58:21.230 回答
8

这里的正确答案不适合我的用例,但问题确实如此。因此,额外的答案。

我的用例:关闭一个文档(可能是打开的几个文档之一)但不关闭应用程序。

在这种情况下(在撰写本文时,除非我只是在错误的地方寻找),文档并没有它应有的帮助。

canCloseDocumentWithDelegate:shouldCloseSelector:contextInfo:我在我的 NSDocument 子类中添加了一个覆盖,并在其中调用了 super。文档没有说明您是否必须调用 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上有一些关于这个方法的有用的讨论。如果这种方法有缺点或更好的方法,请发表评论。

于 2012-12-17T18:41:46.187 回答