2012-04-26 19 views
6

हालांकि मुझे यकीन है कि वे मौजूद हैं, मुझे व्यू कंट्रोलर में आउटलेट घोषित करने के लिए आधिकारिक सर्वोत्तम अभ्यास खोजने या पिन करने में कठिनाई हो रही है।क्या आईबीओलेट्स इवर या गुण होना चाहिए?

वहाँ 3 विकल्प अब तक मैं देख सकता हैं:

  1. इवर केवल
  2. संपत्ति केवल
  3. संपत्ति एक इवर

Xcode वर्तमान में दुर्घटनाओं के साथ समर्थन किया है जब मैं कोशिश करते हैं और ऑटो आईबी से मेरे व्यू कंट्रोलर में खींचकर एक संपत्ति उत्पन्न करें, लेकिन मुझे जो याद है, उससे ऐसा करने से एक ivar के बिना संपत्ति बन जाती है। इवर सेक्शन में खींचना भी संभव है और इससे संपत्ति के बिना एक इवर बन जाएगा। इससे पता चलता है कि संपत्ति-केवल और इवर केवल आउटलेट दोनों एप्पल के साथ ठीक हैं।

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

ऐसा लगता है कि एकमात्र पैटर्न जो हमें बिना किसी एक्सेसर के आउटलेट को रिहा करने की इजाजत देता है, एक आईवर के साथ समर्थित संपत्ति का उपयोग कर रहा है, इसलिए हम अपने आईवर को मैन्युअल रूप से अपने एक्सेसर का उपयोग किए बिना रिलीज कर सकते हैं, हालांकि यह है एक विकल्प जो ऐप्पल की कोड-पीढ़ी का समर्थन नहीं करता है।

उत्तर

1

अंगूठे के नियम के रूप में, मैं आम तौर पर IBOutlet एस के लिए एक्सेसर्स बना देता हूं।

//.h (ARC) 
@property (nonatomic, weak) IBOutlet UILabel* myLabel; 

//.h (non-ARC) 
@property (nonatomic, retain) IBOutlet UILabel* myLabel; 

//.m 
@synthesize myLabel; 

इस तरह से आप के लिए एक उदाहरण चर बनाने के लिए संकलक दे सकते में:

एआरसी या गैर एआरसी परियोजनाओं में मैं आमतौर पर निम्न कार्य करें। लेकिन आप अपने इंस्टेंस वैरिएबल को भी घोषित कर सकते हैं और कंपाइलर को इसका इस्तेमाल करने के लिए कह सकते हैं।

फिर आप जहां भी चाहें उस एक्सेसर्स/इंस्टेंस वैरिएबल का उपयोग कर सकते हैं।

Apple Memory Management guide कहता है कि आपके पास गैर-एआरसी परियोजनाओं के दौरान init या dealloc विधियों में एक्सेसर्स विधियों से बचने के लिए है। तो, उदाहरण के लिए:

// (non-ARC) 
- (void)dealloc 
{ 
    [myLabel release]; myLabel = nil; // I'm using the instance variable here! 
    [super dealloc];  
} 

गैर-एआरसी परियोजनाओं में यह बहुत महत्वपूर्ण है। इसका कारण यह है कि, यदि कोई एक्सेसर नहीं है, तो केवीसी इंस्टेंस वैरिएबल को निब ऑब्जेक्ट असाइन करेगा और उस पर बनाए रखेगा। यदि आप इसे जारी करना भूल जाते हैं, तो आप मेमोरी रिसाव कर सकते हैं। उस ऑब्जेक्ट को अंत में रिलीज़ करने के लिए एक्सेसर बल का उपयोग करना।

मैं दृढ़ता से माइक ऐश द्वारा friday-qa-2012-04-13-nib-memory-management पढ़ने का सुझाव देता हूं। यह निब और मेमोरी प्रबंधन पर एक बहुत अच्छा लेख है।

उम्मीद है कि यह मदद करता है।

+0

धन्यवाद। यह स्पष्ट और एक अच्छा लिंक है। – Undistraction

+0

@ 1 अविभाज्य आपका स्वागत है। यदि आप चाहते हैं तो उत्तर के रूप में ऊपर या चिह्नित करें। चीयर्स। –

+0

इंस्टेंस वैरिएबल रिलीज के बाद सुपर डेलोक पर कॉल करना चाहिए। –

1

यहाँ चर कि अन्य वर्गों द्वारा पहुँचा जा जाएगा के लिए मेरी समझ

उपयोग गुण है, या तो (getters) से पढ़ने के लिए या (setters) को पत्र लिखा। दोनों सेटर्स और गेटर्स गुणों के लिए संश्लेषित होते हैं।

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

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

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