2009-03-16 4 views
8

문서 기반 응용 프로그램이 있고 하위 클래스가 NSDocument이고 필요한 방법을 제공하지만 내 문서는 광범위한 정리 (외부 작업 등을 실행해야 함)가 필요합니다. 이것을 넣을 수있는 가장 좋은 곳은 어디입니까? 나는 다음과 같은 몇 가지 방법을 시도 :NSDocument 하위 클래스에 대한 정리 코드는 어디에 넣으시겠습니까?

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

내가 dealloc에 넣어 경우, 때때로 전화를 도착 다른 시간을 그 않습니다 (Command + Q를 눌러 내 문서의 할당 취소를 우회하는 것 같습니다). 그러나이 코드는 fai없이 호출됩니다. 유혹 (프로그램이 예기치 않게 종료되지 않는 한).

답변

8

각 문서는 NSApplicationWillTerminateNotification의 로컬 알림 센터에서 옵저버로 추가하십시오. 알림 메서드에서 정리 메서드 (dealloc 또는 close에서도 호출해야 함)를 호출합니다.

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에이 방법의 몇 가지 유용한 토론이있다. 이러한 접근 방식이나 더 나은 방법에 대한 단점이 있다면 의견을 말하십시오.

+2

전적으로 정확하다고 생각하지 않습니다. shouldCloseSelector는 문서를 닫을 준비가되었거나 (예 : 성공적으로 저장 한 경우) 호출되기 때문에 shouldCloseSelector에서만 정리를 수행해야합니다. 이 canClose 메소드가 호출되는 것은 문서가 실제로 닫힐 것임을 나타내지는 않습니다 (예 : 저장이 실패 할 수 있음). – Joel

관련 문제