कोई कट और सूखे जवाब नहीं है। हालांकि, याद रखें कि समयपूर्व अनुकूलन खराब है। मैक पर या आईफोन पर कोको में, एक्सेसर्स/गुणों का उपयोग केवीओ-अनुरूप होना आवश्यक है। कोर डेटा और कोको बाइंडिंग के लिए स्वचालित रूप से कार्य करने के लिए केवीओ अनुरूपता आवश्यक है। कोर डेटा में, गुणों को संशोधित करते समय केवीओ को सुनिश्चित करना आवश्यक नहीं है, बल्कि उन्हें एक्सेस करते समय भी आवश्यक है।
जब आप प्रॉपर्टी मेमोरी मैनेजमेंट व्यवहार सुनिश्चित करना चाहते हैं तो एक्सेसर्स/गुणों का उपयोग करना सबसे अच्छा है, जो कहने के लिए, हमेशा सेटर या डॉट नोटेशन का उपयोग करने के लिए ivar सेट करते समय, और आपके द्वारा अनुसरण किए जाने वाले मेमोरी प्रबंधन पैटर्न के आधार पर , ivar प्राप्त करते समय हमेशा एक्सेसर्स/गुणों का उपयोग करने के लिए।
कई अलग-अलग मेमोरी प्रबंधन पैटर्न हैं। सभी गैर-टूटे हुए लोग यह सुनिश्चित करते हैं कि एक एक्सेसर द्वारा लौटाई गई वस्तु कम से कम वर्तमान ऑटोरेलीज़ स्कोप के अंत तक जीवित रहेगी। मतलब, या तो ऑब्जेक्ट को स्पष्ट रूप से बनाए रखा गया है और वर्तमान ऑटोरेलीज़ स्कोप में ऑटोरेलेज्ड किया गया है। विधि एप्पल द्वारा सिफारिश की गेटर में स्पष्ट रूप से यह करता है:
- (id)foo {return [[foo retain] autorelease]; }
- (void)setFoo:(id)aFoo {
if(! [aFoo isEqual:foo]) {
[foo release];
foo = [aFoo retain];
}
}
यह है कि पैटर्न वे अपने संश्लेषित accessors में पालन है निहित है। व्यक्तिगत रूप से, मैं सेटर में autorelease करना पसंद करते हैं:
- (id)foo {return foo;}
- (void)setFoo:(id)aFoo {
[foo autorelease];
foo = [aFoo retain];
}
इस नए मूल्य और इसकी जगह से पहले पुराने मूल्य autoreleasees। यह गेटटर में बनाए रखने और ऑटोरेलीज़िंग के समान ही प्रभाव डालता है, लेकिन ऑब्जेक्ट को केवल एक ऑटोरेलीज पूल में जोड़ने के लिए आवश्यक है। अधिकांश समय इसमें एक की गिनती होती है और इसे स्वत: बंद नहीं किया जाता है, इसलिए यह कहीं भी नहीं होगा, इससे कोई फर्क नहीं पड़ता कि क्या होता है। अगर संपत्ति को उस कोड के दौरान प्रतिस्थापित किया गया है जो अभी भी इसे पकड़ रहा है (जैसे कि एक प्रतिनिधि कॉलबैक में), तो यह इसके अंतर्गत से गायब नहीं होगा।
इसका मतलब यह है कि एक्सेसर्स/गुणों का उपयोग करने से आपको विश्वास होगा कि आपकी ऑब्जेक्ट्स तब तक रहेंगी जब तक उन्हें कोड के किसी अन्य भाग के बिना उन्हें आपके नीचे से जारी करने की आवश्यकता न हो।
एक्सेसर्स/गुणों का हमेशा उपयोग करने का अंतिम और सबसे अच्छा कारण यह है कि यह प्रत्येक संपत्ति के लिए एक कम धारणा बनाता है: उस संपत्ति के लिए अंतर्निहित ivar है, और इसका एक ही नाम है (मुझे लगता है कि यह दो धारणाएं हैं) । शायद भविष्य में आप एक इवर को व्युत्पन्न एक्सेसर के साथ बदलना चाहेंगे। संपत्ति नोटेशन अभी भी काम करेगा। शायद आप ivar को फिर से नाम देना चाहते हैं; संपत्ति अभी भी काम करेगी। सौभाग्य से, एक्सकोड में रीफैक्टरिंग आमतौर पर भरोसा किया जा सकता है, लेकिन परेशान क्यों?
ऑब्जेक्ट उन्मुख प्रोग्रामिंग का बिंदु वर्ग पर परिभाषित इंटरफेस का उपयोग करना है। कक्षा के लिए अपने स्वयं के इंटरफ़ेस को अनदेखा करने के लिए कोई अच्छा कारण नहीं है (हालांकि कई पूर्वाग्रह और तर्कसंगत हैं)। एक्सेसर्स को छोड़कर प्रत्येक विधि को सामान्य मामले में, ऑब्जेक्ट को पवित्र रूप से और इसके आंतरिक राज्य को निजी के रूप में माना जाना चाहिए। प्रत्येक विधि को लिखें जैसे कि यह एक श्रेणी में या उप-वर्ग में था, और ivars को निजी राज्य के रूप में मानें, जब तक कि विशिष्ट डिज़ाइन की आवश्यकता नहीं होती है अन्यथा आप अन्यथा करते हैं। सीधे इवर तक पहुंचने के बहुत अच्छे कारण हैं, लेकिन वे केस-दर-मामले आधार पर निर्धारित होते हैं।
मुझे यहां एक समान पोस्ट मिली: http://stackoverflow.com/questions/1051543/should-i-use-self-keyword-properties-in-the-implementation – Jonah