2011-09-21 13 views
8

जहां तक ​​मैं समझता हूं @property .h फ़ाइल में गेटर और सेटर की घोषणा करता है और @ सिंथेसाइज .m फ़ाइलों में गेटर और सेटर लागू करता है। इसके अलावा @synthesize का उपयोग करने के बजाय गेटटर और सेटर के लिए अपना स्वयं का कार्यान्वयन लिखना संभव है।उद्देश्य-सी: कार्यान्वयन के बिना @property घोषणा (@ सिंथेसाइज)

तो अगर हमें हमेशा सेटर/गेटटर को लागू करने की आवश्यकता है तो हमें इसे अतिरिक्त रूप से घोषित करने की आवश्यकता क्यों है? @property मेरे लिए semantical अनावश्यक और बग के लिए एक स्रोत प्रतीत होता है।

जब मैं @property घोषित करता हूं तो क्या खुश होता है लेकिन इसे @ सिंथेसाइज़ या मैन्युअल रूप से कार्यान्वित करना भूल जाता है? जब मैं @ सिंथेसाइज का उपयोग करता हूं और @property घोषणा भूल जाता हूं तो क्या खुशी होती है?

उत्तर

26

गुण अब डिफ़ॉल्ट रूप से संश्लेषित किए जाते हैं, क्योंकि एक्सकोड 4.4, इसलिए हाँ, आप सही हैं, यह अनावश्यक था और ऐप्पल ने @property और @ सिंथेसाइज दोनों को लिखने की आवश्यकता को हटा दिया, बस अभी से @property का उपयोग करें।

+0

अच्छा है कि उन्होंने इसे जोड़ा। प्रतिक्रिया –

+8

के लिए धन्यवाद अभी भी एक मामला है जहां आपको दोनों संपत्तियों का उपयोग करने और एक साथ संश्लेषित करने की आवश्यकता होगी। कंपाइलर ivar बनाने के लिए संपत्ति नाम और अंडरस्कोर उपसर्ग का उपयोग करेगा। यदि ivar _propertyname एक निजी आवृत्ति चर के साथ टकराता है, तो आपको इसे एक नए ivar में संश्लेषित करने की आवश्यकता होगी। उदाहरण के लिए: यदि आप UIToolbar को उप-वर्गीकृत कर रहे हैं, और इसे नाम देने वाली संपत्ति घोषित करते हैं तो आपको ivar _delegate का उपयोग करने में त्रुटि मिल जाएगी क्योंकि UIToolbar में एक निजी इंस्टेंस वेरिएबल आईडी _delegate है। आप इसे '@ सिंथेसाइज प्रतिनिधि = _mydelegate;' का उपयोग करके हल कर सकते हैं। – lolol

4

जब मैं एक @property घोषित लेकिन यह @synthesize साथ या मैन्युअल रूप से लागू करने के लिए भूल जाते हैं क्या happends? जब मैं @ सिंथेसाइज का उपयोग करता हूं और @property घोषणा को भूल जाता हूं तो क्या खुशी होती है?

आप कोशिश क्यों नहीं करते? यदि आप एक्सेसर्स को संश्लेषित करना चाहते हैं या अपना खुद का प्रदान करना भूल जाते हैं, तो संकलक आपको चेतावनी देगा। (और यदि आपने चेतावनियों को त्रुटियों के रूप में इलाज करने के लिए सेट किया है, जो एक अच्छा विचार है, तो चेतावनी को याद करना असंभव है।) दूसरा मामला आम तौर पर संकलन त्रुटि का कारण बनता है।

तो अगर हमें हमेशा सेटर/गेटटर को लागू करने की आवश्यकता है तो हमें अतिरिक्त घोषणा क्यों करनी है? @property मुझे और बग के लिए स्रोत के लिए semantical अनावश्यक प्रतीत होता है।

यह बस कहें, @property एक संपत्ति घोषणा है और @synthesize एक संभव कार्यान्वयन है। एक हेडर (= सार्वजनिक इंटरफेस विवरण) से संबंधित है, दूसरा कार्यान्वयन फ़ाइल के लिए। यदि आप इस तरह से नहीं करेंगे तो आप इसे कैसे करेंगे?

6

ज फ़ाइल

@property (retain, nonatomic) NSString* userName; 

में नीचे होने

और @synthesize मीटर में अपने स्वयं के लिए छोड़ने के लिए वाक्यात्मक चीनी है के लिए

-(NSString*)userName; 

-(void)setUserName:(NSString*)userName; 
ज फ़ाइल में

वाक्यात्मक चीनी है आपकी संपत्ति घोषणा में निर्दिष्ट आपके retain, nonatomic आदि का सम्मान करके कार्यान्वयन।

आप @property के साथ संश्लेषित नहीं कर सकते हैं, भले ही आपने .h फ़ाइल में उपयुक्त गेटर, सेटर हस्ताक्षर निर्दिष्ट किया हो।

लेकिन आप @ सिंथेसाइज छोड़ सकते हैं और अपना खुद का गेटर और सेटर लागू कर सकते हैं।

यदि आपने @ सिंथेसिस और आपके कस्टम गेटर सेटटर दोनों को भी किया है, तो रन-टाइम आपके कार्यान्वयन का सम्मान करता है और उसे कॉल करता है।

+0

अच्छी व्याख्या – onmyway133

2

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

+0

मुझे उस "किसी भी तरह" में रूचि है। मैं कुछ डॉट स्टाइल गुणों को एक शब्दकोश के साथ वापस करना चाहता था और पूरी तरह असफल रहा। शायद एक प्रश्न के लिए फल। –

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