2009-06-26 25 views
11

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

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

self.myProperty = [someObject someAutoReleasedObject]; 

के बजाय:

myProperty = [[someObject someAutoReleasedObject] retain]; 

इस कारण से है? तो क्या केवल कुछ स्थितियां हैं जिनमें संपत्ति का उपयोग करना अच्छा होगा?

मैं उद्देश्य-सी के लिए नया हूं, और यह उन कुछ चीजों में से एक है जो मुझे भ्रमित कर चुके हैं। अब तक मैंने सीधे आवृत्ति चर का उपयोग किया है, सबसे अधिक संभावना झूठी धारणा के तहत कि संपत्ति के माध्यम से जाने से वास्तव में एक विधि/संदेश कॉल/भेजता है और अनावश्यक ओवरहेड जोड़ता है। मुझे पूरा यकीन है कि मैं इसके साथ गलत हूं, लेकिन अगर ओवरहेड में अंतर नगण्य है (यदि कोई भी है तो भी), कोई भी इसे जोड़ने में क्यों चुनता है जब कोई आसानी से चर का उपयोग कर सकता है?

मुझे पूरा यकीन है कि मैं अपनी सोच में गलत हूं, इसलिए मैं यहां पूछ रहा हूं।

+0

मैं इस मान्य करने के लिए कोई डेटा नहीं है लेकिन एप्पल से प्रलेखन के अनुसार:। "तरीकों आप सीधे अपने वर्ग के उदाहरणों में से उदाहरण चर का उपयोग कर सकते में हालांकि, प्रत्यक्ष पहुंच के बजाय एक्सेसर विधियों की अनुशंसा की जाती है, उन मामलों को छोड़कर जहां प्रदर्शन सर्वोपरि है। " देखें: http://developer.apple.com/DOCUMENTATION/Cocoa/Conceptual/ObjCTutorial/10AppendixA/10AppendixA.html –

+0

आह ठीक है, धन्यवाद। हालांकि यह एक जवाब के रूप में बेहतर होगा। –

+0

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

उत्तर

5

सबसे पहले, आपको एप्पल दस्तावेज (और अच्छे कारणों से) के अनुसार इनिट या डेलोक में सेटर्स या गेटर्स का उपयोग नहीं करना चाहिए।

इसके अलावा, आपको आमतौर पर चर सेट करने के लिए सेटटर का उपयोग करना चाहिए यदि कोई है।

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

निश्चित रूप से, कार्यान्वयन में गेटर का उपयोग करना अधिक सामान्य और सुरक्षित है, लेकिन यह आमतौर पर व्यर्थ और अपर्याप्त है। अपनी पसंद करें।

सेटर का उपयोग करना महत्वपूर्ण है क्योंकि यह अन्य कोड के लिए परिवर्तन (कुंजी मूल्य निरीक्षण) का निरीक्षण करने के साथ-साथ उप-वर्गों को सेटटर को ओवरराइड करने और किसी भी अन्य समायोजन की आवश्यकता के लिए एक अवसर प्रदान करता है।

हालांकि एक चीज जो मैं अत्यधिक अनुशंसा करता हूं वह है कि आप अपने इवर और अपनी संपत्ति के लिए एक अलग नाम का उपयोग करें। सामान्य सम्मेलन एक अंडरस्कोर उपसर्ग (_) है, हालांकि मैं व्यक्तिगत रूप से i_ का उपयोग उपसर्ग के रूप में ऐप्पल के निजी उपयोग के साथ किसी भी भ्रम से बचने के लिए करता हूं। इस तरह आप गलती से उपयोग नहीं कर सकते गलत एक:

self.name // use property 
i_name // use ivar 
self.i_name // syntax error 
name // syntax error 
+0

फिर उत्तर देने के लिए पीटर धन्यवाद मेरे प्रश्नों में से एक यदि कोई और जल्द ही अधिक विस्तृत स्पष्टीकरण प्रदान नहीं करता है, तो मैं आपको उत्तर के रूप में चिह्नित करूंगा। वैसे, ऊपर दिए गए उदाहरण में गुणों के लिए उपनाम बनाने के लिए, मैं @ सिंथेसाइज नाम = i_name; सही? साथ ही, क्या आप भ्रम के बारे में मुझे साफ़ करने के लिए मेरी मूल पोस्ट में उल्लिखित मेरी सबसे संभावित गलत धारणाओं को संबोधित कर सकते हैं? धन्यवाद मैं इसकी प्रशंसा करता हूँ। –

+1

हां, @ सिंथेसाइज नाम = i_name। –

0

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

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

  • कोई संबंधित समस्या नहीं^_^