2009-03-16 8 views
8

मेरे पास एक दस्तावेज़-आधारित एप्लिकेशन है और मेरे पास उप-वर्गीकृत NSDocument है और आवश्यक विधियां प्रदान की गई हैं, लेकिन मेरे दस्तावेज़ को कुछ व्यापक सफाई-अप (बाहरी कार्यों को चलाने की आवश्यकता है) की आवश्यकता है। इसे रखने के लिए सबसे अच्छी जगह कहां है? मैं इस तरह के रूप में कुछ अलग अलग तरीकों की कोशिश की है:आप NSDocument उप-वर्गों के लिए क्लीनअप कोड कहां डालते हैं?

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

अगर मैं dealloc में रख, कभी कभी यह कहा जाता है और हो जाता है दूसरी बार ऐसा ऐसा नहीं करता है (कमांड + क्यू दबाकर मेरे दस्तावेज़ के डेलोकेशन को बाईपास करना प्रतीत होता है), लेकिन यह अनिवार्य है कि इस कोड को बिना फी के बुलाया जाता है लालसा (जब तक कि प्रोग्राम अप्रत्याशित रूप से समाप्त नहीं हो जाता)।

उत्तर

8

क्या प्रत्येक दस्तावेज़ NSApplicationWillTerminateNotification के लिए स्थानीय अधिसूचना केंद्र में स्वयं को पर्यवेक्षक के रूप में जोड़ता है। इसकी अधिसूचना विधि में, इसकी क्लीन-अप विधि को कॉल करें (जिसे आपको dealloc या close से भी कॉल करना चाहिए)।

8

सही उत्तर यहां मेरे उपयोग के मामले में फिट नहीं हुआ, लेकिन सवाल यह है। इसलिए अतिरिक्त जवाब।

मेरा उपयोग केस: एक दस्तावेज़ बंद करना (जो कई खुले में से एक हो सकता है) लेकिन आवेदन बंद नहीं कर रहा है।

इस मामले में (लेखन के समय और जब तक कि मैं केवल गलत जगह पर नहीं देख रहा हूं) documentation उतना सहायक नहीं है जितना हो सकता है।

मैंने अपने NSDocument सबक्लास में canCloseDocumentWithDelegate:shouldCloseSelector:contextInfo: ओवरराइड जोड़ा और इसके अंदर सुपर कहा। दस्तावेज यह नहीं कहता कि आपको सुपर कॉल करना है, लेकिन कुछ लॉगिंग से पता चलता है कि सिस्टम एक चयनकर्ता और संदर्भ प्रदान कर रहा है। दस्तावेज बंद होने से ठीक पहले इस विधि को बुलाया जाता है।

- (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

मुझे नहीं लगता कि यह पूरी तरह से सही है: आपको केवल चाहिएCloseSelector में क्लीनअप करना चाहिए क्योंकि दस्तावेज़ बंद होने के लिए तैयार होने पर केवल क्लक्लोज़ सिलेक्टर को कॉल किया जाता है (उदा। सफलतापूर्वक सहेजा गया)। यह कॉलक्लोस विधि बुलाया जा रहा है यह इंगित नहीं करता है कि दस्तावेज़ वास्तव में बंद हो जाएगा (उदा। सहेजने में असफल हो सकता है)। – Joel

संबंधित मुद्दे