【问题标题】:Where do you put cleanup code for NSDocument sub-classes?您将 NSDocument 子类的清理代码放在哪里?
【发布时间】:2009-03-16 04:20:00
【问题描述】:

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

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

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

【问题讨论】:

    标签: cocoa macos nsdocument document-based


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      在这种情况下(在撰写本文时,除非我只是找错了地方)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 上对此方法进行了一些有用的讨论。如果这种方法有缺点或更好的方法,请发表评论。

      【讨论】:

      • 我认为这并不完全正确:您应该只在 shouldCloseSelector 中进行清理,因为只有在文档准备好关闭(例如成功保存)时才会调用 shouldCloseSelector。调用此 canClose 方法并不表示文档将实际关闭(例如,保存可能失败)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-01
      • 2014-11-21
      • 1970-01-01
      • 2017-01-20
      • 1970-01-01
      • 1970-01-01
      • 2010-09-15
      相关资源
      最近更新 更多