2013-12-18 3 views
9
-(void) scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    PO(NSStringFromCGPoint(self.tableView.contentOffset)); 
    PO(NSStringFromUIEdgeInsets(self.tableView.contentInset)); 

    while(false); 
} 

-(void)dealloc 
{ 
    PO(NSStringFromClass([self class])); 
    PO(@"Deallocated"); 
    self.tableView.delegate=nil; 
} 

यहां मुझे त्रुटि से बचने के लिए self.tableView.delegate = nil सेट करने की आवश्यकता है।यदि ऑब्जेक्ट को नष्ट किया जा रहा है तो हम डीलोक पर शून्य पर प्रतिनिधि क्यों सेट करते हैं?

मुझे पता है, मेरे पिछले प्रश्न से, कि self.tableView.delegate स्वचालित रूप से शून्य हो जाएगा जब प्रतिनिधि नष्ट हो जाएगा। ऐसा इसलिए है क्योंकि प्रतिनिधि का प्रकार कमजोर संदर्भ के बजाय संदर्भ निर्दिष्ट करता है।

हालांकि, self.tableView के बारे में क्या?

self.tableView के मजबूत संदर्भ के साथ एकमात्र चीज यह पर्यवेक्षण है जिसका स्वामित्व स्वयं और स्वयं itsef है।

तो जब स्वयं नष्ट हो जाता है, self.tableView भी नष्ट किया जाना चाहिए और इसका मतलब है self.tableView.delegate भी चला जाएगा।

तो मुझे self.tableView.delegate=nil सेट करने की आवश्यकता क्यों है;

उत्तर

5

यदि आपके पास self.tableView का एकमात्र संदर्भ है, तो प्रतिनिधि को शून्य पर सेट करने की आवश्यकता नहीं है।

एकमात्र ऐसी स्थिति जहां आपको प्रतिनिधियों को शून्य पर सेट करना है, यदि किसी अन्य वर्ग में एक प्रतिनिधि के रूप में आपकी कक्षा है, क्योंकि यदि आपकी कक्षा नष्ट हो गई है, तो वह अन्य वर्ग आपकी कक्षाओं को कुछ तरीकों को लागू करने के लिए देखेगी, और आपका कॉल वहां नहीं होगा।

-1

असल में यह आवश्यक नहीं है। हम इसे बनाए रखने के चक्र से बचने के लिए ऐसा कर रहे हैं। हमें मजबूत संदर्भ के साथ एक प्रतिनिधि नहीं बनाना चाहिए। यदि आपने गलती से मजबूत संदर्भ के साथ एक प्रतिनिधि बनाया है तो माता-पिता और बच्चे दोनों को रिहा नहीं किया जाएगा। उस मामले में dealloc खुद को बुलाया नहीं जाएगा। तो यह जरूरी नहीं है।

9

आपको कई मामलों में निदान करने के लिए प्रतिनिधि सेट करने की आवश्यकता है। आपके मामले में तालिका दृश्य को कुछ बाहरी वर्ग द्वारा संदर्भित किया जा सकता है और आपकी कक्षा डेलोक विधि के बाद नष्ट नहीं होगा। और दुर्घटना की ओर अग्रसर अपनी प्रतिनिधि विधि को जारी रखेगा। कई वर्ग हैं जो किसी अन्य धागे में काम करते हैं (उदाहरण के लिए NSURLConnection)। यहां तक ​​कि यदि आप इसे छोड़ देते हैं तो यह प्रतिनिधि विधियों को जारी रख सकता है क्योंकि यह किसी अन्य धागे में बनाए रखा जाता है।

0

चलें कहते हैं कि हम एक SpriteKitscene जहाँ आप एक gesture recognizer है है और आप अपने delegate निर्धारित किया है।

फिर dealloc यह scene और इसके recognizercontroller से।

यह क्रैश का नेतृत्व करेगा यदि delegate विधि scene में इस प्रक्रिया के दौरान कहा गया था।

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

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