आपको केवल init
और dealloc
में अपने आइवरों से निपटना चाहिए या जहां एक कार्यान्वयन विस्तार (जैसे एक्सेसर के अंदर, या जहां आपको वास्तव में स्मृति पता की आवश्यकता है) द्वारा पूरी तरह से आवश्यक है। उन स्थानों के अलावा, आपको हमेशा एक्सेसर का उपयोग करना चाहिए, जिसका अर्थ है [self foo]
_foo
के बजाय।
self.foo
वास्तविक कॉल के आसपास सिंटैक्टिक चीनी है, जो [self foo]
है। यह समझना महत्वपूर्ण है कि self.foo
एक मानक ओबीजेसी संदेश भेजता है, और इसका अर्थ है [self foo]
जैसा ही है। सम्मेलन के अनुसार, आपको गुणों का जिक्र करते समय केवल डॉट-सिंटैक्स का उपयोग करना चाहिए।
प्री-एआरसी, इवार्स का सीधा उपयोग मेरे अनुभव में दुर्घटनाओं का # 1 कारण था।एआरसी के बिना सीधे आईवर को आवंटित करते समय आप को खराब करने की संभावना प्रोग्राम के दायरे में 100% तक पहुंच जाती है।
एआरसी के बाद से, मैं अब भी तर्क देता हूं कि आपको हमेशा एक्सेसर्स (ऊपर दिए गए अपवादों के साथ) का उपयोग करना चाहिए, लेकिन कारण अधिक सूक्ष्म हैं। इसका मुख्य कारण यह है कि एक एक्सेसर को या तो मौजूदा वर्ग में, उप-वर्ग में, या केवीओ के माध्यम से अनुकूलित किया जा सकता है (जो आपके कोड के बाहर पूरी तरह से होता है)। यदि आप सीधे इवर तक पहुंचते हैं, तो आप इसे बाईपास करेंगे। उदाहरण के लिए, कहें कि संपत्ति आलसी ढंग से बनाई गई है (जो कि काफी आम है)। फिर यदि आप इसे बनाने से पहले ivar का उपयोग करते हैं, तो आपको सूक्ष्म बग मिल जाएगी। इसलिए आपको उस संपत्ति के लिए हमेशा एक्सेसर का उपयोग करना याद रखना होगा। इसी तरह, आप setNeedsDisplay
पर कॉल कर सकते हैं या अधिसूचना पोस्ट कर सकते हैं, या जैसे।
यदि आपके पास एक सरल नियम है जो कहता है "मैं हमेशा एक्सेसर्स का उपयोग करता हूं" तो कोड को देखना आसान है और यह सही है। कुछ मामलों में आपको एक्सेसर को बाधित करने की आवश्यकता है, _
कहता है "अरे, यहां ध्यान दें, मैं कुछ अजीब कर रहा हूं।"
यदि आपके पास कोई नियम है "मैं उन गुणों के लिए एक्सेसर्स का उपयोग करूंगा जिनकी आवश्यकता है, लेकिन उन लोगों के लिए नहीं जो" नहीं "तो कोड को देखना लगभग असंभव है और पता है कि यह सही है या नहीं। क्या पिछले डेवलपर ने इवर का उपयोग किया क्योंकि यह आवश्यक था या सिर्फ इसलिए कि वह ऐसा महसूस कर रहा था? क्या आप इसे बदल सकते हैं या नहीं? यह जानना बहुत मुश्किल है।
तो पोस्टर एआरसी भी एक्सेसर्स का उपयोग करके लगातार रक्षात्मक प्रोग्रामिंग है और मैं अत्यधिक अनुशंसा करता हूं।
वैसे यह रग्गर के जवाब के साथ सुपर विवादित है! आप सेटटर के माध्यम से अतिरिक्त अतिरिक्त जोड़ा के बारे में क्या सोचते हैं? और यह भी तथ्य कि अन्य लोग कोड के साथ काम कर रहे हैं और सेटर्स/गेटर्स को अप्रत्याशित परिणामों के कारण बदल रहे हैं? – jgvb
"अतिरिक्त" बनाए रखना "अतिरिक्त" नहीं है। यह जरूरी है कि आपको आवेदन करना होगा, और यह करने के लिए एक्सेसर सही जगह है (यह केवल पूर्व-एआरसी पर लागू होता है, लेकिन लागू होने में असफल होने पर असफलता का उल्लेख किया गया है)। आप एक्सेसर्स का बिल्कुल उपयोग करना चाहते हैं * क्योंकि * अन्य लोग कोड पर काम कर रहे हैं, और यह सुनिश्चित करने का कोई तरीका नहीं है कि वे सभी जानते हैं और हमेशा "जब आप इस ivar को बदलते हैं, तो आपको भी ..." का सही तरीका दस्तावेज कि कस्टम आवश्यकता एक्सेसर के माध्यम से है। –
कभी-कभी यह आश्चर्यजनक परिणाम (उदाहरण के लिए अक्सर कुछ बार फिर से गणना करना) का कारण बनता है, लेकिन उन दुष्प्रभावों को लगभग हमेशा मेरे अनुभव में डीबग करना बहुत आसान होता है, इस तथ्य की तुलना में कि आपको पता नहीं था कि आपको सेटिंग के बाद 'setNeedsDisplay' को कॉल करना था इवर इससे चीजों की ओर इशारा होता है कि "जब वे ऐसा नहीं करते हैं, तो वे काम करते हैं" जो डीबग करना बेहद मुश्किल है। एक एक्सेसर चलाना जब आपको पता नहीं था कि यह स्टैक ट्रेस में दिखाई देगा। एक एक्सेसर चलाने में विफल होने पर आपको नहीं पता था कि आपको दौड़ने की जरूरत है .... यह खोजना मुश्किल है। –