你在哪里放置NSDocument子类的清理代码?

时间:2009-03-16 04:20:01

标签: cocoa macos nsdocument document-based

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

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

如果我把它放在dealloc中,有时它会被调用,有时它会被调用(按下Command + Q似乎绕过我的文件的释放),但强制要求调用此代码而不会失败(除非程序意外终止)。

2 个答案:

答案 0 :(得分:9)

让每个文档在NSApplicationWillTerminateNotification的本地通知中心中以观察者身份添加自己。在其通知方法中,调用其清理方法(您也应该从deallocclose调用)。

答案 1 :(得分:8)

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

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

在这种情况下(在写作时,除非我只是在错误的地方看),documentation并没有那么有用。

我在我的NSDocument子类中添加了canCloseDocumentWithDelegate:shouldCloseSelector:contextInfo:覆盖,并在其中调用了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对此方法有一些有用的讨论。如果这种方法存在缺点或更好的方法,请发表评论。