iphone सकत मुझे सुपर-डिलोक को अंतिम बार क्यों कॉल करना है, और पहले नहीं?




मोबाइल नंबर को प्राइवेट नंबर बनाने के लिए तरीका (5)

सही उदाहरण:

- (void)dealloc {
    [viewController release];
    [window release];
    [super dealloc];
}

गलत उदाहरण:

- (void)dealloc {
    [super dealloc];
    [viewController release];
    [window release];
}

Althoug अन्य सभी मामलों में जब एक विधि को ओवरराइड करते हैं तो मैं पहले सुपर के विधि कार्यान्वयन को कॉल करता हूं, इस मामले में सेब हमेशा अंत में [सुपर डेलोक] कहता है। क्यूं कर?


[आखिरी पोस्ट में] क्या तालिका प्रतिनिधि प्रतिनिधि को संदर्भित नहीं करेगा, अपने स्वयं के प्रतिनिधि को रिहा करने के लिए जिम्मेदार होगा? मुझे लगता है कि इसे सेट करते समय इसे बनाए रखा जाएगा (ताकि आप इसे रिलीज़ या ऑटोरेलीज़ कर सकें) और यह स्वयं का ख्याल रखेगा?

ओपी प्रश्न के लिए, अगर मैं विनाश कर रहा हूं तो मैं हमेशा सुपर का निर्माण कर रहा हूं और सुपर अंतिम कॉल करूँगा। मैं इसके बारे में सोचता हूं "मैं सुपर बिल्ड करना चाहता हूं जो चाहता है ताकि मैं उस पर निर्माण कर सकूं, और मैं अपने बाद साफ होने के बाद सुपर को फाड़ना चाहता हूं।" वस्तुतः सभी कॉल जो मैं उपयोग कर रहा हूं, निर्माण कर रहे हैं, हालांकि, डेलोक को छोड़कर, इसलिए आप इसे हमेशा मेरे डेलोक कोड में देख पाएंगे।


[सुपर डेलोक] आपके ऑब्जेक्ट द्वारा उपयोग की जाने वाली मेमोरी को खाली कर रहा है, जिसमें पॉइंटर्स को कंट्रोलर और विंडो देखने के लिए शामिल किया गया है। उन्हें मुक्त करने के बाद वेरिएबल्स का जिक्र करना सबसे अच्छा है।

यह जवाब देखें।


मुझे आईफोन के लिए प्रोग्रामिंग के बारे में कुछ भी पता नहीं है, लेकिन मुझे लगता है कि यह उसी कारण से है कि विनाशकों को रिवर्स ऑर्डर में बुलाया जाना चाहिए। आप यह सुनिश्चित करना चाहते हैं कि आपके सुपरक्लास को कॉल करने से पहले आपके सभी 'कचरा' को साफ़ कर दिया जाए। यदि आप इसे करते हैं तो चीजों के आसपास दूसरी तरफ गन्दा हो सकता है। उदाहरण के लिए, यदि आपके विनाशक को स्मृति तक पहुंचने की आवश्यकता है कि सुपर विनाशक पहले से ही मुक्त हो चुका है:

class X {
    private Map foo;

    function __construct() {
        foo = new Map();
    }

    function __destruct() {
        foo.free;
    }
}

class Y extends X {
    function __construct() {
        super.__construct();
        map.put("foo", 42);
    }

    function __destruct() {
        super.__destruct();
        if (map.containsKey("foo")) {    // boooooooooom!
            doSomething();
        }
    }
}

आपको अपने कोड में इस समस्या का सामना नहीं करना पड़ सकता है, क्योंकि "आप जानते हैं कि आप क्या कर रहे हैं", लेकिन यह ऐसी चीजों को न करने के लिए एक सुरक्षित और समग्र बेहतर अभ्यास है।


यह सिर्फ एक दिशानिर्देश है। आप [super dealloc] बाद अन्य निर्देशों को कॉल कर सकते हैं। हालांकि आप सुपरक्लास के चर का उपयोग नहीं कर सकते हैं क्योंकि जब आप [super dealloc] कहते हैं तो उन्हें रिहा कर दिया जाता है। अंतिम पंक्ति में सुपरक्लास को कॉल करना हमेशा सुरक्षित रहता है।

इसके अलावा केवीओ और निर्भर (ट्रिगर) चाबियां साइड इफेक्ट्स उत्पन्न कर सकती हैं अगर वे पहले से ही जारी किए गए सदस्य चर के निर्भर हैं।


अंततः आप लगभग [super dealloc] अंत में हैं क्योंकि यह सुपरक्लास के चर को मुक्त करता है और अब उन्हें एक्सेस नहीं किया जा सकता है।

एक अपवाद यह है कि यदि आपके पास UITableViewController का उप-वर्ग है जो किसी अन्य वर्ग का उपयोग अपने तालिका दृश्य प्रतिनिधि के रूप में कर रहा है। उस स्थिति में आपको [super dealloc] बाद तालिका दृश्य प्रतिनिधि को रिलीज़ करना होगा क्योंकि तालिका दृश्य तालिका दृश्य प्रतिनिधि का संदर्भ दे रहा है और तालिका दृश्य को पहले रिलीज़ करना होगा।





uikit