2012-10-04 11 views
8

मैं उद्देश्य सी के लिए बहुत नया हूं (अब दो दिन)। @synthesize के बारे में पढ़ने पर, यह मेरी समझ @property (जिसे मैंने समझा था) के साथ ओवरलैप करना प्रतीत होता था ... इसलिए, मेरे दिमाग में कुछ विवरणों को लोहे से बाहर करने की जरूरत है ... यह मुझे परेशान कर रहा है।@property और @synthesize

कृपया मुझे सही कर अगर मैं @property और @synthesize के अंतर के बारे में गलत हूँ:

आप अपने @interface में एक @property घोषित, तो आप दुनिया उन मानक getters और के लिए निर्धारक के उपयोग करने के लिए उम्मीद कर सकते हैं कि कह रहे हैं वह संपत्ति फ़्यूथरमोर, एक्सकोड आपके लिए जेनेरिक गेटर्स और सेटर्स बनाएगा। ... लेकिन, पर कौन सी डिग्री @property घोषणा के साथ होती है? (आईई कि आपके @interface?

-या-

में अपने @interface में "पूरी तरह से" ... इसके लिए अनदेखी घोषणाओं की तरह मतलब है, और यह भी अनदेखी कोड @property में अनदेखी कोड घोषणाओं की देखभाल करता है आपके @interface केवल - @synthesize अपने @implementation अनुभाग में अनदेखी कोड कार्यान्वयन का ख्याल रखता है, जबकि)

+3

इस तरह के बारे में सोचें यदि आपके पास '@ संपत्ति' अधिक संभावना है तो आपको '@ संश्लेषण' की आवश्यकता होगी। ऐसा इसलिए है क्योंकि हां '@ संपत्ति 'दुनिया को बता रही है कि एक सामान्य' गेटर 'और' सेटर 'की आवश्यकता होती है लेकिन' @ संश्लेषण 'वास्तव में' गेटर्स 'और' सेटर्स 'बना रहा है, आप इसे ओवरराइड कर सकते हैं और अपना खुद का बना सकते हैं 'गेटर्स' और 'सेटर्स' यदि आप जेनरेट किए गए लोगों को पसंद करते हैं तो वे बहुत बुनियादी होंगे। पॉल हेगर्टी द्वारा आईट्यून्सयू आईपैड और आईफोन एप्लीकेशन डेवलपमेंट की घड़ी देखें, इस तरह से मैं इसके बारे में सोचता हूं और यह अभी तक विफल नहीं हुआ है। – Popeye

+0

बहुत बहुत धन्यवाद Popeye ... आईट्यून्स यू फैनस्टिक है !!! मैं वास्तव में पाठ 4 या पॉल की 2011 श्रृंखला पर हूं। मैं बस बैक अप ले रहा हूं, इन श्रृंखलाओं के साथ एक्सकोड 4 लर्निंग ऑब्जेक्टिव सी पढ़ रहा हूं ... फिर भी यह मुझे स्पष्ट रूप से स्पष्ट नहीं था। – RichWalt

उत्तर

7

@property जो कुछ atomicity और सेटर अर्थ विज्ञान उपलब्ध कराने के साथ अपने वर्ग पर एक संपत्ति की घोषणा की।

एक्सकोड 4.4 के साथ, ऑटोसिंथेसिस उपलब्ध है जिसमें आपको @synthesize में घोषित किए बिना आपकी संपत्ति से बैकिंग आईवर प्रदान किया जाता है। इस ivar का _propertyName का रूप है जहां आपकी संपत्ति का नाम propertyName है।

+0

इसने सिर, नाखून और सरल पर नाखून मारा है। +1 – Popeye

+0

हां ... मुझे पता था कि आप एक अलग इवर के साथ "अपनी संपत्ति var वापस" कर सकते हैं (जिसे आपकी कक्षा द्वारा उपयोग किया जाना चाहिए, और विशेष रूप से गेटर्स और सेटर्स के साथ।) ... आपकी प्रतिक्रिया के लिए बहुत बहुत धन्यवाद। .. मैं आने वाले उपयोगी उत्तरों की गति से अभिभूत हूं ... (यह केवल कुछ मिनट पहले शामिल होने के बाद मेरी पहली पोस्ट है)! - इस पोस्ट को एलन बनाने के लिए समय निकालने के लिए धन्यवाद! – RichWalt

16

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

@property एक्सेसर्स की घोषणा है। यह सिर्फ एक घोषणा है।

@property (nonatomic, readwrite, strong) NSString *something; 

बनाम

- (NSString *)something; 
- (void)setSomething:(NSString)aSomething; 

मुख्य अंतर यह है कि @property का उपयोग कर इन तरीकों की घोषणा की सुविधा देता है संकलक स्वचालित रूप से आपके लिए जनरेट (संश्लेषण) कार्यान्वयन है: वहाँ निम्नलिखित बीच बहुत कम अंतर है। कोई आवश्यकता नहीं है कि आप संकलक को आपके लिए ऐसा करने दें। आप something और setSomething: को हाथ से लागू करने के लिए बिल्कुल स्वतंत्र हैं, और ऐसा करना आम है। लेकिन, यदि आप उन्हें हाथ से लागू नहीं करते हैं, तो संकलक स्वचालित रूप से आपके लिए _something नामक एक ivar बना देगा और गेटर और सेटर के लिए उचित कार्यान्वयन करेगा।

एक्सकोड के पुराने संस्करणों में, आपको स्पष्ट रूप से @synthesize कीवर्ड का उपयोग करके ऑटो-पीढ़ी का अनुरोध करना था। लेकिन अब इसकी आवश्यकता नहीं है। आज, @synthesize का उपयोग करने का एकमात्र कारण यह है कि यदि आप चाहते हैं कि ivar के पास गैर-मानक नाम हो (कभी ऐसा न करें)।

यहां एक महत्वपूर्ण बिंदु यह है कि something और setSomething: विधियां हैं। उनके बारे में जादुई कुछ भी नहीं है। वे विशेष "संपत्ति के तरीके नहीं हैं।"। वे सिर्फ तरीकों कि सम्मेलन पहुँच राज्य के एक टुकड़े से राज्य का यह टुकड़ा अक्सर एक इवर में संग्रहीत किया जाता हो, लेकिन हो सकता है की जरूरत नहीं है

और भी अधिक स्पष्ट है:। object.something करता नहीं मतलब है" object से इवर _something नामित लौट आते हैं। "इसका मतलब है" [object something] का परिणाम लौटने के लिए, जो कुछ भी करता है। "यह आम बात है कि एक इवर का मान देने के लिए के लिए।

आप अपने राज्य के सभी (आंतरिक घोषित करना चाहिए और बाहरी) @property घोषणाओं का उपयोग करके, और आपको सीधे इवर घोषित करने से बचना चाहिए। आपको अपने एक्सेसर्स (self.something) के माध्यम से हमेशा अपनी संपत्तियों तक पहुंचना चाहिए, सिवाय इसके कि init और dealloc विधियां। init और dealloc में, आपको सीधे ivar (_something) का उपयोग करना चाहिए।

+0

रॉब, आपके समय और प्रतिक्रिया के लिए बहुत बहुत धन्यवाद। पिछले साल (2011) से आईट्यून्स यू पर आईओएस वीडियो देखना ... और एक्सकोड में होने वाले बदलावों को बनाए रखने की कोशिश करना कभी-कभी कुछ भ्रम पैदा करता है। प्रशिक्षक को ध्यान से सुनना, और यहां तक ​​कि सरल कोड के साथ परीक्षण करना ... बिल्ली, यहां तक ​​कि एक्सकोड दस्तावेज पढ़ने से पूरी तरह से स्पष्ट नहीं हुआ कि @ सिंथेसिस आवश्यक नहीं था! आपकी तरह की सहायक पुष्टि आत्मविश्वास में जोड़ती है कि मैंने कुछ गलत नहीं सीखा ... जैसा कि मैं साथ चलता हूं। :-) अब ... अगर किसी के पास कुछ बाहरी लिंक है जहां मैं एमवीसी के बारे में ठीक से सोचना शुरू कर सकता हूं - यह बहुत अच्छा होगा !! – RichWalt

+0

यहां प्रारंभ करें: http://developer.apple.com/library/ios/#documentation/General/Conceptual/CocoaEncyclopedia/Model-View-Controller/Model-View-Controller.html%23//apple_ref/doc/uid/ TP40010810-CH14। फिर यहां: http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/Introduction/Introduction.html#//apple_ref/doc/uid/TP40007457 –

+0

मैं इसे अभी देख रहा हूं! बहुत - बहुत धन्यवाद!!!! – RichWalt

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