2012-05-17 14 views
10

के साथ डीआईडीयूलोड करें क्या मुझे अभी भी आईबीओलेट गुणों को देखने के लिए सेट करने की आवश्यकता है, एआरसी के साथ डाउनलोड करें?क्या मुझे अभी भी आईबीओलेट गुणों को देखने के लिए सेट करने की ज़रूरत है। एडीसी

क्योंकि यह अभी भी निम्नलिखित टिप्पणी उत्पन्न करता है:

// रिलीज किसी भी मुख्य दृश्य के subviews बनाए रखा।

+4

[आईबीओलेटलेट और एडीसी के तहत व्यूडिडलोड के संभावित डुप्लिकेट] (http://stackoverflow.com/questions/7682322/iboutlet-and-viewdidunload-under-arc) –

उत्तर

2

IBOutlets के लिए के रूप में मजबूत आप अभी भी viewDidUnload में उन्हें बाहर नहीं के बराबर करना चाहते हैं चिह्नित।

क्यों:

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

13

खैर आउटलेट को निकालने का मुख्य उद्देश्य यह है कि उपन्यासों में सुपर व्यू नहीं होने पर ज़ोंबी, लीक और अजीब परिस्थितियां उत्पन्न नहीं होतीं, जबकि व्यू कंट्रोलर से दृश्य को अनलोड किया गया था।

Xcode के नवीनतम संस्करण के साथ अब

यदि आप एक हैडर के अंदर या एक निजी घोषणा में एक दृश्य तत्व खींचें यह स्वचालित रूप से कमजोर (लक्षित कर आईओएस> = 5) है और यह भी viewDidUnload विधि में यह [self setYourOutlet:nil]; शायद लिखेंगे को आउटलेट सेट इस मामले में जरूरी नहीं है, लेकिन यह एक अच्छा अभ्यास है। यदि आप निचले आईओएस को लक्षित करते हैं तो आवश्यक है, क्योंकि आप कमजोर संदर्भ का उपयोग नहीं कर सकते हैं। मैं हमेशा उपयोग करने का सुझाव देता हूं क्योंकि एक अच्छी आदत है।

अद्यतन

मैं जवाब गलतफहमी से बचने के लिए (iOS5 के बारे में बात केवल) ध्यान देना है कि आईबी कमजोर ही अगर एक मुख्य दृश्य के subviews हैं आउटलेट सेट को पूरा करना चाहते हैं। आम तौर पर यह एक दृश्य नियंत्रक से एक दृश्य युक्त एक xib में होता है।

कभी-कभी ऐसा हो सकता है कि आपको रनटाइम पर कुछ स्थितियों के आधार पर दो दृश्यों को प्रोग्रामेटिक रूप से या अलग-अलग xibs के बिना स्वैप करने की आवश्यकता हो। उदाहरण के लिए आपके पास वीसी द्वारा स्वामित्व वाला मुख्य दृश्य है, और उसी xib में आप दो अन्य विचार बनाते हैं कि उस पल में पर्यवेक्षण नहीं होता है। यदि आप उन्हें उसी तकनीक से कनेक्ट करने का प्रयास करते हैं तो बनाया गया संदर्भ strong होगा। रनटाइम पर आप अब पाठ्यक्रम के पर्यवेक्षण से जोड़ने या हटाने के विचारों को स्वैप कर सकते हैं, आपको उन्हें viewDidUnload में रखना चाहिए।

+0

आप निम्न अच्छे अभ्यास पर क्यों विचार करते हैं; '[स्वयं सेट YourOutlet: शून्य]; शायद इस मामले में जरूरी नहीं है, लेकिन एक अच्छा अभ्यास है? –

+0

@ रिओमायर अच्छी तरह से, कल्पना करें कि आपको तैनाती लक्ष्य को 4.3 तक कम करने की आवश्यकता है, इस मामले में आपको केवल कमजोर बदलना होगा, असुरक्षित – Andrea

+0

अच्छा, धन्यवाद। –

11

मैं एंड्रिया के उत्तर पर विस्तार करूँगा (उसे ऊपर उठाएं!) क्योंकि उत्तर सीधे तब तक आगे नहीं है जब तक कि आप केवल यूआई घटकों का मतलब न दें, इस मामले में उन्हें सभी कमजोर होना चाहिए।

आईबीओटलेट जो भी आप उन्हें परिभाषित करते हैं। आप का उपयोग करते हैं:

@property (nonatomic, strong) IBOutlet UIView *someView;

इस शून्य आपको चाहिये जब जनक दृश्य/खिड़की उतारने।

यदि आप कार्य करें:

@property (nonatomic, weak) IBOutlet __weak UIView *someView;

आप, चर शून्य की जरूरत नहीं है, क्योंकि यह स्वत: zero'ed हो जाएगा।

आप कैसे पूरी तरह से आप पर निर्भर हैं। चाप से पहले मैं प्रयोग किया है:

[someView_ release], someView_ = nil;

अब आपके पास दो विकल्प हैं: या तो (@synthesize साथ साथ बनाया) सेटर या अंतर्निहित इवर सीधे सेट का उपयोग करें। नतीजा वही है - दोनों मामलों में ऑब्जेक्ट के आजीवन क्वालीफायर इसे अंतिम उपयोग करेंगे और इसे रिलीज़ करेंगे।

तो, आगे जाना है और ऐसा करते हैं:

self.someView = nil

या

@synthesize someView = someView_; 
... 
someView_ = nil; 
+4

+1 यह सही उत्तर है। संसाधनों को मुक्त करने के लिए आपको 'शून्य' पर मजबूत संदर्भ सेट करना होगा। 'शून्य' पर कमजोर संदर्भ सेट करने की कोई आवश्यकता नहीं है क्योंकि यदि संसाधन को हटा दिया जाता है तो संकलक आपके लिए ऐसा करेगा। – Caleb

+0

मैंने सोचा कि एआरसी सेट * मजबूत * गुणों के तहत संकलक भी शून्य है? –

+0

इससे कोई फर्क नहीं पड़ता - आप इसे पढ़ नहीं सकते हैं। निष्पादन के दौरान किसी भी समय कमजोर गुण शून्य हो सकते हैं। जब आप * आखिरकार * स्थानीय रूप से स्कॉप्ड * ऑब्जेक्ट का उपयोग करते हैं * आप इसे शून्य करते हैं (संकलक इसे रिलीज़ करते हैं), यदि आप इसका उपयोग करना जारी रखते हैं तो आप एक शून्य मान देख सकते हैं। वैकल्पिक रूप से आप संकलक से बाहर होने पर संकलक को स्थानीय रूप से स्कॉप्ड ऑब्जेक्ट को छोड़ने दे सकते हैं, लेकिन दायरे को छोड़कर * अंतिम * उपयोग का तात्पर्य है क्योंकि आप कभी भी शून्य मान नहीं देखते हैं। मजबूत * गुण * आपकी कक्षा में स्कॉप्ड होते हैं, इसलिए निहित रिलीज डेलोक में होता है, जिसके बाद आप सदस्य तक नहीं पहुंच सकते हैं। –

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

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