2010-02-02 12 views
14

मुझे पता है कि सार्वजनिक उदाहरण चर को @ सार्वजनिक कीवर्ड के साथ परिभाषित करना संभव है। हालांकि, उद्देश्य-सी वाक्यविन्यास अन्य वर्ग 'चर का उपयोग करने की अनुमति नहीं देता है। @ सार्वजनिक Ivar से मुझे किन सुविधाओं की अपेक्षा की जानी चाहिए? या मैं अन्य वर्ग 'इवर्स तक कैसे पहुंचूं?उद्देश्य-सी में किसी अन्य वर्ग से @public इंस्टेंस चर का उपयोग कैसे करें?

उत्तर

57

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

एक उद्देश्य-सी वर्ग वास्तव में isa फ़ील्ड (जो यह एक वस्तु बनाता है) के साथ एक सादे-पुराने सी संरचना में उबाल जाता है, जहां सार्वजनिक क्षेत्र पहुंच योग्य होते हैं। चूंकि हम कक्षाओं के उदाहरणों से निपट रहे हैं, हम एक वस्तु (विशेष संरचना) के लिए एक सूचक काम कर रहे हैं। इस प्रकार, हम -> का उपयोग करके सार्वजनिक क्षेत्रों तक पहुंचते हैं।

यहाँ एक उदाहरण है:

@interface SomebodyIsntEncapsulating : NSBadIdea { 
    @public 
    NSString *badIdea; 
    BOOL shouldntDoIt; 

    @protected 
    NSString *ahThatsBetterThankGod; 

    @private 
    NSString *sweetThanksNowEvenMySubclassesCantTouchMe; 
} 

अब, कुछ पूरी तरह से अलग संदर्भ में, हम हो सकता है:

SomebodyIsntEncapsulating *whatOh = [[SomebodyIsntEncapsulating alloc] 
             initWithDanger:kDangerLevelEpicBraceYourself]; 
whatOh->badIdea = [@"I'm a public field. Make sure to retain or copy me!" copy]; 
NSLog(@"Please! Write some accessors and mutators!: %@", whatOh->badIdea); 

मुझे आशा है कि आप मदद की!

+1

विस्तृत उत्तर के लिए धन्यवाद। यह वही है जो मैं जानना चाहता हूं! – Eonil

+10

हाहा जिसने मेरी सुबह बनाई। अच्छा उत्तर – Chris

6

आप का उपयोग कर की तरह उस तक पहुँच सकते -> (सूचक द्वारा सदस्य) आप सामान्य रूप से एक सी संरचना के सदस्यों का उपयोग जैसे ऑपरेटर (ध्यान दें कि आप Obj सी में एक वस्तु के लिए एक सूचक है):

... 
@public 
int a; 
... 

myObject->a = 1; 
2

आपको ऐसा करने के लिए एक्सेसर विधियों को लिखना होगा। ऑब्जेक्ट उन्मुख डिजाइन का तात्पर्य है कि किसी वर्ग को किसी अन्य वर्ग की वस्तुओं की आंतरिक संरचना की परवाह नहीं करनी चाहिए।

उस ने कहा, आईडी सिर्फ एक सूचक है, इसलिए आप obj-> ivar कर सकते हैं, बशर्ते आप जानते हों कि आप क्या कर रहे हैं और उचित एक्सेसर विधि लिखने का कोई तरीका नहीं है।

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