当前位置:  开发笔记 > IOS > 正文

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

如何解决《你在哪里放置NSDocument子类的清理代码?》经验,为你挑选了2个好方法。

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

close

close:

canCloseDocumentWithDelegate:shouldCloseSelector:contextInfo

dealloc

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



1> Peter Hosey..:

将每个文档作为观察者添加到本地通知中心NSApplicationWillTerminateNotification.在其通知方法中,调用其清理方法(您也应该从中调用deallocclose).



2> Obliquely..:

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

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

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

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上对这个方法有一些有用的讨论.如果这种方法存在缺点或更好的方法,请发表评论.


我不认为这是完全正确的:您应该只在shouldCloseSelector中进行清理,因为只有在文档准备好关闭(例如成功保存)时才会调用shouldCloseSelector.调用此canClose方法并不表示文档实际上将被关闭(例如,保存可能会失败).
推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有