2011-08-31 14 views
5

मैं उद्देश्य सीबुनियादी उद्देश्य सी चर घोषणा

में कैसे चर घोषित किया जाता है

1 से हैरान हूँ: मैं देख रहा हूँ @property और @synthesize बयान इस्तेमाल किया जा रहा। इसके बारे में मेरा सवाल है, इन 2 कथन के लिए क्या हैं? वे हमेशा एक साथ क्यों उपयोग किए जाते हैं? मुझे लगता है कि @synthesize गेटर और सेटर बनाने के लिए शॉर्टकट है?

2: कहें, मैं एक एनएसएमयूटेबलएरे घोषित करना चाहता हूं जो केवल उस कक्षा के अंदर पहुंच योग्य होगा जो घोषित किया गया था। मुझे myArray = [[NSMutableArray alloc] init] को addObject विधि का उपयोग करने के लिए कुछ लिखने से पहले करना होगा। मैं सरणी कब जारी करूं?

3: क्या एक वेरिएबल घोषित करने का कोई अलग तरीका है जो केवल कक्षा में ही पहुंच योग्य है, जिसे सभी वर्गों में पहुंच योग्य घोषित किया गया था?

4: प्रश्न 2 के समान, लेकिन अब चर एक एनएसएसटींग है। मुझे & आवंटित करने की आवश्यकता क्यों नहीं है, इसे एक ही चर को अपनी कक्षा में साझा करने के लिए? self.myString = @""; से myString = @"";

के बीच अलग क्या है धन्यवाद।

+0

आप उद्देश्य-सी में मिल के रूप में, आप स्टैनफोर्ड पाठ्यक्रम (iTunes) को देखने के लिए चाहते हो सकता है। इससे मुझे सीखने की वक्र उठने में मदद मिली। – nykash

+0

यह एक बहुत व्यापक सवाल है जो जमीन को कवर करता है जो एसओ पर अच्छी तरह से है। कृपया एकबार आस - पास देख लें। यहां चार पिछली पोस्ट हैं जो आपके प्रश्नों को संबोधित करती हैं। 1: [? क्या @property और @synthesize के बीच का अंतर है] (http: // stackoverflow।कॉम/प्रश्न/80637 9 /) 2: [जब एक आवृत्ति चर जारी करने के लिए] (http://stackoverflow.com/questions/4063905/) 3: [उदाहरण के बाहर दिखाई देने वाले आवृत्ति चर घोषित कैसे करें?] (http://stackoverflow.com/questions/5826345/) 4: [self.var बनाम var के बीच अंतर] (http://stackoverflow.com/questions/4627646/) इनमें से प्रत्येक विषय पर अन्य लोग हैं। –

उत्तर

1

1) @property सार्वजनिक रूप से सुलभ चर और संबंधित गेटर और सेटर घोषित करता है। @synthesize संकलक को गेटटर और सेटर की परिभाषा (कोड) स्वचालित रूप से उत्पन्न करने का कारण बनता है।

2) आप हेडर फ़ाइल में, अपनी कक्षा घोषणा में एनएसएमयूटेबलएरे को घोषित करेंगे। आप अपने init विधि में चर प्रारंभ करेंगे, और आप चर को dealloc विधि में रिलीज़ करेंगे।

3) @property का उपयोग कर बनाई चर सार्वजनिक कर रहे हैं। चर (हेडर फाइल में @interface का प्रयोग करके) अपनी कक्षा घोषणा में परिभाषित @private कीवर्ड का उपयोग उस वर्ग के लिए निजी रूप में घोषित किया जा सकता है।

जॉन, इन सवालों के बहुत बुनियादी रहे हैं। आप शायद ऑब्जेक्टिव-सी प्रोग्रामिंग परिचय यहाँ (http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjectiveC/Introduction/introObjectiveC.html#//apple_ref/doc/uid/TP30001163) से बाहर एक बहुत मिलेगा।

+0

'@ property' सार्वजनिक रूप से सुलभ _variable_ घोषित नहीं करता है। Ivar स्वयं (अगर संश्लेषित) '@ संरक्षित' है। यह घोषणा करता है कि कक्षा के कुछ पहलू के लिए एक पहुंच बिंदु है। वास्तव में जब तक आप गेटटर और सेटर विधि (या सिर्फ 'पाठक' के मामले में) प्राप्त करने के अनुबंध को पूरा करते हैं, तब तक इसे एक चर का समर्थन करने की आवश्यकता नहीं होती है। –

+0

स्पष्टीकरण जोश के लिए धन्यवाद। –

+1

एफडब्ल्यूआईडब्ल्यू, यदि आप अपना खुद का गेटर और/या सेटर लिखते हैं, तो संपत्ति में एक ivar भी नहीं होता है। यह कुछ भी गणना कर सकता है, या एक आइटम से दूसरे में परिवर्तित कर सकता है। जैसे एक एंगल क्लास संपत्ति संपत्ति रेडियंस के रूप में संपत्ति की डिग्री भी हो सकती है। केवल संपत्ति रेडियंस के पास बैकिंग इवर है, लेकिन संपत्ति की डिग्री (सेटर और गेटर, 'डिग्री' और 'सेटडिग्रीज़' के माध्यम से क्रमशः) दिशा के आधार पर रेडियंस में और उससे परिवर्तित होती है। एक फ़ाइल क्लास में एक पूर्ण नाम संपत्ति हो सकती है जो पूरी तरह से योग्य नाम उत्पन्न करने या विश्लेषण करने के लिए सर्वर, निर्देशिका और फ़ाइल नाम का उपयोग करती है। –

5

अपने पहले प्रश्न के लिए:

@property (nonatomic, retain) NSString * someProperty; 

इस वर्ग की संपत्ति की घोषणा की। यह वर्ग के सार्वजनिक अनुबंध का हिस्सा बन जाता है लेकिन अभी भी कुछ महत्वपूर्ण अभाव है - वास्तविक क्रियान्वयन

@synthesize someProperty; 

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

आप लगभग सभी स्थितियों में, प्रत्येक @property के लिए हमेशा @synthesize रखते हैं।


अपने दूसरे प्रश्न के लिए:

आप कैसे अपने सरणी संपत्ति प्रारंभ करने के बारे में सही हैं।आदेश इसे जारी करने में आप क्या करेंगे अपनी कक्षाओं dealloc विधि में निम्नलिखित:

- (void) dealloc { 
    self.myarray = nil; 

    [super dealloc]; 
} 

यह प्रभावी रूप से (यह मानते हुए कि आप उस कीवर्ड साथ अपनी संपत्ति की घोषणा को बनाए रखने) सरणी विज्ञप्ति।


और अपने आखिरी सवाल के लिए:

एक वर्ग के गुण हमेशा अन्य वर्गों से उपलब्ध हैं। वैश्विक रूप से सुलभ परिवर्तनीय बनाने के लिए आप इसे static के रूप में घोषित करेंगे।

+0

आपके पास प्रत्येक संपत्ति के लिए '@ सिंथेसाइज 'नहीं हो सकता है। यह '@ गतिशील 'भी हो सकता है, या आप बस एक ivar घोषित कर सकते हैं और सही ढंग से नामित विधियों को लागू कर सकते हैं। –

+0

मैं आपके पहले बिंदु से सहमत हूं, लेकिन आपका दूसरा बिंदु @property से संबंधित नहीं है और केवीसी से अधिक संबंधित है। प्रतिबिंबित करने के लिए मेरा जवाब संपादित किया। – Perception

+1

@ जोश: वास्तव में। अन्य टिप्पणियों में से एक में, मैंने कुछ उदाहरण दिए हैं जहां आप अपने स्वयं के एक्सेसर्स लिखते हैं और यहां तक ​​कि एक ivar भी नहीं है, क्योंकि एक्सेसर्स अन्य माध्यमों पर निर्भर हो सकते हैं (प्रत्यक्ष फ़ाइल पहुंच, एक बंदरगाह, डेटाबेस, एक एल्गोरिदम इत्यादि। ।) सीधे ivar पाने या सेट करने के बजाय। ऐसे मामलों में, आप संश्लेषित नहीं करते हैं। –

2

विज्ञापन 1: एक संपत्ति गेटर्स और सेटर्स द्वारा एक ivar (आमतौर पर निजी) तक पहुंच नियंत्रित करने के लिए एक निर्माण है। असल में, एक संपत्ति को एक सहायक ivar भी नहीं है। हां, @ सिंथेसाइज गेटटर और सेटर (और इवर) ​​उत्पन्न करता है।

विज्ञापन 2: जब आपको इसकी आवश्यकता नहीं होती है तो आप इसे रिलीज़ करते हैं। जब यह आपके कोड के तर्क पर निर्भर करता है।

विज्ञापन 3: अगर मैं सही ढंग से समझता हूं, तो आप @ निजी Ivars चाहते हैं। आम तौर पर, इवर संरक्षित होते हैं, यानी कक्षा के भीतर या व्युत्पन्न कक्षाओं में केवल पहुंच योग्य है। निजी ivars केवल कक्षा के भीतर ही सुलभ हैं। गुण सार्वजनिक रूप से सुलभ हैं।

विज्ञापन 4: myString = @ "" सीधे ivar को लिखता है, जबकि self.myString = @ "" प्रॉपर्टी सेटर का उपयोग करता है।

+0

मैंने एक अवसर के बारे में चिंतित किया जिससे मैं कक्षा के अंदर ivar वापस नहीं पढ़ सका। मैं तब 'ivar = something' का उपयोग कर रहा था। इसे 'self.ivar = something' में बदलकर समस्या हल हो गई। क्या आप कुछ अंतर्दृष्टि साझा कर सकते हैं? मुझे लगता है कि इवर को ऑटो रिलीज़ हो गया क्योंकि मैं वापस पढ़ रहा था। अगर यह मदद करता है, तो इवर सीएलएलोकेशन था। मुझे 'एनएसएसटींग 'इवर के लिए' स्वयं 'प्रदर्शन करने की ज़रूरत नहीं थी। – John

+0

गुण, अगर (प्रतिलिपि) या (बनाए रखने) के रूप में घोषित किया गया है, तो आइटम को बरकरार रखेगा (और पिछली वस्तु को छोड़ देगा), जबकि सीधे आईवर तक पहुंचने से कुछ भी नहीं होता है। गुण आपको स्मृति प्रबंधन करने में मदद करते हैं, क्योंकि संकलक कोड उत्पन्न करेगा जो आइटम को ठीक से बनाए रखता है और रिलीज़ करता है। वे अभी भी dealloc में जारी किया जाना चाहिए, ज़ाहिर है। तो शायद init और dealloc में छोड़कर, हर जगह गुणों का उपयोग करने की कोशिश करें। –

0

आप ऑब्जेक्टिव-सी पर एक पाठ प्राप्त या एक ऑनलाइन ट्यूटोरियल खोजने की जरूरत है - यह एक पर्याप्त रहस्यमय भाषा है जिसे आप dribs और drabs में यह लेने के लिए आशा नहीं कर सकता है।

चर हैं और गुण हैं - दो अलग-अलग चीजें जो कुछ हद तक छेड़छाड़ करती हैं।

आप C/C++ में के रूप में सादे पुराने उदाहरण चर उसी तरह घोषणा कर सकते हैं, और अधिक या कम:

NSArray* myArray; 

जैसे, @interface की {} संलग्न अनुभाग में रखा।

लेकिन आपके पास एक संपत्ति भी हो सकती है, जिसे आप @interface घोषणा (} बंद करने के बाद) कहकर घोषित कर सकते हैं। एक संपत्ति में गेटटर विधि होती है - डिफ़ॉल्ट रूप से myProperty - और एक पुटर विधि - जिसे डिफ़ॉल्ट रूप से setMyProperty कहा जाता है। यदि myProperty आपके इंस्टेंस चर के रूप में एक ही नाम है तो आप स्वचालित रूप से इन विधियों को बनाने के लिए @synthesize का उपयोग कर सकते हैं।

ध्यान दें कि गुण डिफ़ॉल्ट सेटटर विधि का उपयोग होने पर स्वचालित रूप से retain एड हो सकता है। भंडारण के प्रबंधन के मामले में यह काफी सुविधाजनक है।

लेकिन प्रबंध भंडारण एक बड़ा विषय है, जो आप पर कुछ अच्छा ट्यूटोरियल पढ़ें चाहिए है - हम कुछ पैराग्राफ में यह व्याख्या नहीं कर सकते।

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