2011-10-07 20 views
35

के तहत, अतः here पर यह करने के लिए एक ऐसी ही सवाल ही नहीं है, लेकिन मैं अभी कुछ किया गया था कि पूरी तरह से वहाँ नहीं समझाया स्पष्ट करना चाहते हैं।IBOutlet और viewDidUnload एआरसी

मैं समझता हूं कि सभी प्रतिनिधियों और दुकानों - वास्तव में एक "मूल" वस्तु का कोई संदर्भ, एक अच्छा नागरिक होने के लिए और एक मिनट के लिए ऑब्जेक्ट ग्राफ़ के बारे में सोचें - कमजोर संदर्भों को शून्य करना चाहिए। कमजोर पॉइंटर्स को शून्य करने की प्रकृति के कारण संदर्भित ऑब्जेक्ट की निरंतर गणना शून्य पर पहुंचने के लिए स्वचालित रूप से शून्य हो जाती है, क्या इसका मतलब यह है कि viewDidUnload में आईबीओटलेट्स को शून्य करने के लिए अब अनावश्यक है?

तो, अगर मैं अपने आउटलेट तो तरह की घोषणा:

@property (nonatomic, weak) IBOutlet UILabel *myLabel; 

निम्नलिखित कोड है कोई असर?

- (void)viewDidUnload 
{ 
    self.myLabel = nil; 

    [super viewDidUnload]; 
} 
+0

मैं कृपया नीचे वोट के कारण को जानना चाहूंगा? – Stuart

+0

मैं भी उत्तर के बारे में उत्सुक था इसलिए मैंने विरोध करने के लिए वोट दिया। मुझे जवाब नहीं पता ... – bryanmac

उत्तर

15

बस अनुसंधान के एक बिट कर ...

मैं यह समझ के रूप में, कमजोर, आवंटित करने के लिए इसी तरह की है कि वे दोनों कमजोर संदर्भ कर रहे हैं।

हालांकि, असाइन शून्यकरण संदर्भ नहीं बनाता है। यानी यदि प्रश्न में वस्तु नष्ट हो जाती है, और आप उस संपत्ति तक पहुंचते हैं, तो आपको BAD_ACCESS_EXCEPTION मिल जाएगा।

कमजोर गुण स्वचालित रूप से ध्यान केंद्रित किया जाता है (= शून्य) जब वस्तु यह संदर्भित कर रहा है नष्ट हो जाता है।

दोनों ही मामलों में, यह नहीं के बराबर करने के लिए गुण सेट करने के लिए के रूप में यह प्रश्न में वस्तु की गिनती बनाए रखने के लिए योगदान नहीं करता आवश्यक नहीं है। रखरखाव गुणों का उपयोग करते समय यह आवश्यक है।

जाहिर है, एआरसी भी एक नया "मजबूत" संपत्ति है, जो "बनाए रखने 'के रूप में एक ही है का परिचय?

रिसर्च किया here

+1

प्रतिक्रिया के लिए धन्यवाद। मैं कमजोर संदर्भ के कामकाज को समझता हूं, मेरा प्रश्न 'viewDidUnload' के अंतर्गत तंत्र से संबंधित है। दूसरे शब्दों में, क्या यह हमेशा ऐसा मामला है कि दृश्य 'viewDidUnload' कॉल के बाद सीधे' शून्य 'के कमजोर संदर्भ को मजबूर करेगा? – Stuart

+2

फिर से, ** जैसा कि मैं इसे समझता हूं **, व्यू और उसके सबव्यू को डिस्प्ले से हटाए जाने पर रिलीज़ किया जाएगा। चूंकि, कमजोर रिलीज गिनती में वृद्धि नहीं करता है, और जब इसका संदर्भ नष्ट हो जाता है तो शून्य हो जाता है, यह आवश्यक नहीं होना चाहिए। –

+1

क्षमा करें, मैंने इसे पहली बार पढ़ते समय आपके उत्तर के उस हिस्से को याद किया होगा। – Stuart

11

मैं एक छोटे से परीक्षण किया था और ऐसा लगता है कि viewDidUnload विधि में कोड अनावश्यक है। इस का समर्थन करने के लिए, viewDidUnload के लिये दस्तावेज वास्तव में क्या करते कहते हैं:

समय इस विधि कहा जाता है के द्वारा, दृश्य संपत्ति नहीं के बराबर है।

संकेत देते हुए कि कमजोर संदर्भ स्वचालित रूप से nil पर सेट होना चाहिए।

+3

यह भी मेरी समझ है। लेकिन फिर कमजोर आउटलेट बनाने के दौरान 'viewDidUnload' में एक्सकोड' [self setMySubview: nil] 'कथन क्यों डालें? –

+2

मुझे लगता है कि यह _could_ एक ऐसी सुविधा हो जो पूर्व-एआरसी कोड से छोड़ी गई हो, उसी तरह जब आप कोर डेटा के लिए 'एनएसएमएनेज्ड ऑब्जेक्ट' सबक्लास उत्पन्न करने के लिए एक्सकोड से पूछते हैं तो उत्पन्न गुण 'मजबूत' के बजाय 'बनाए रखने' पर सेट होते हैं '। हालांकि आउटलेट के मामले में वे _are_ को 'कमजोर' के रूप में बनाया गया है। मेरा अनुमान है कि यह अनजान है। – Stuart

+0

मैं सहमत हूं। इंटरफेस बिल्डर यूआई कोड में आउटलेट बनाने के लिए ड्रैगिंग और ड्रॉप करते समय सावधानी के पक्ष में है। जब तक आप एआरसी का उपयोग नहीं कर रहे हैं और सवाल में दुकानों पर कमजोर संदर्भ के रूप में उन शून्य सेटिंग्स को सुरक्षित रूप से हटाया जा सकता है। –

3

कैसे दुकानों एआरसी में कामयाब रहे हैं यदि आप एक कमजोर संदर्भ का उपयोग कर रहे हैं की मेरी समझ से, आप viewDidUnload कुछ भी जोड़ने की के रूप में यह पहले से ही नहीं के बराबर हो जाएगा जरूरत नहीं है। ऐसा करना इस प्रकार अनावश्यक है।

हालांकि यदि आपके पास मजबूत आउटलेट हैं, तो कौन से सेब का कहना है कि यदि आप निब में शीर्ष स्तर की वस्तु को इंगित कर रहे हैं तो आपको करना चाहिए, तो आपको इन्हें देखने के लिए निश्चित रूप से उचित लाइन को जोड़ना जारी रखना चाहिए।

+0

मैं जानना चाहता हूं, अगर मैंने इस '@property (nonatomic, strong) IBOutlet UILabel * myLabel को परिभाषित किया है,', क्या मुझे 'self.myLabel = nil;' फ़ंक्शन 'viewDidUnload'' को परिभाषित करने की आवश्यकता है। – BlackMamba

5

मेरे पास कुछ अनुभवजन्य सबूत हैं जो समर्थन करने के लिए हैं कि आईबीओलेट्स वास्तव में पहले ही स्वचालित रूप से शून्य हो गए हैं। यहाँ मैं क्या किया है:

  1. मैं अपने IBOutlet गुण (@synthesize myLabel = myLabel_) के लिए स्पष्ट ivars की स्थापना की ताकि मैं बाद में डीबगर में उनके मूल्यों का निरीक्षण कर सकते हैं।
  2. मैंने viewDidUnload की पहली पंक्ति पर ब्रेकपॉइंट सक्षम किया।
  3. मैंने मेमोरी चेतावनी अनुकरण करके कॉल करने के लिए viewDidUnload की व्यवस्था की।
  4. मैंने स्पष्ट आईवार्स के मूल्यों का निरीक्षण किया जो मैंने अपने आईबीओलेट गुणों से जुड़े थे।

स्पष्ट ivars सभी के पास उनके मूल्य के रूप में nil था तो मैंने ब्रेकपॉइंट मारा।

0

आईओएस 5 और ओएस एक्स 10.7, weak से शुरू होने से स्वचालित शून्यिंग पॉइंटर उत्पन्न होगा। इसका अर्थ यह है कि जब ऑब्जेक्ट ऑब्जेक्ट रिलीज़ होता है, तो पॉइंटर स्वचालित रूप से nil पर सेट होता है (विवरण के लिए Zeroing Weak References in ARC देखें)।

तो, आईओएस के तहत 5 + और ओएस एक्स 10.7+, है ना viewDidUnload विधि में मैन्युअल nil को weakIBOutlet गुणों को सेट करने के लिए उपयोगी है: जब मुख्य दृश्य उतार दिया है, अपने सभी subviews जारी किया जाएगा, इसलिए संबंधित गुण nil पर सेट हैं।