2009-08-11 15 views
9

में इंस्टेंस चर को छुपाएं क्या किसी विधि को पैरामीटर देने के लिए कोई तरीका है, वही नाम छुपाए बिना उद्देश्य-सी में एक आवृत्ति चर के समान नाम?पैरामीटर्स ऑब्जेक्टिव-सी

उदाहरण के लिए,

- (void)doSomething:(id)object 
{ 
    self.object = object; 
}

कोड ऊपर चेतावनी देता है " 'वस्तु' के स्थानीय घोषणा छुपाता उदाहरण चर।"

स्पष्ट समाधान पैरामीटर तर्कों को अलग-अलग नाम देना है, लेकिन मुझे "ऑब्जेक्ट" के बजाय "anObject" जैसे नाम चुनने में परेशानी होती है।

+1

जब आप "स्थानीय चर" कहते हैं, तो मुझे लगता है कि आपका मतलब "आवृत्ति चर" है। पैरामीटर एक प्रकार का स्थानीय चर है। – outis

+0

धन्यवाद आउटिस। मैंने सवाल को सही किया। इस उत्तर के लिए – titaniumdecoy

उत्तर

8

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

औपचारिक रूप से बोलते हुए, यह लैम्ब्डा कैलकुस में alpha conversion पर प्रतिबंधों से संबंधित है, विशेष रूप से एक बाध्य चर बाध्य होना चाहिए और एक मुक्त चर मुक्त रहना चाहिए।

यदि आपको स्थानीय लोगों के लिए "ए" उपसर्ग पसंद नहीं है, तो आप उदाहरण चर के लिए "_" उपसर्ग सम्मेलन का उपयोग कर सकते हैं, क्योंकि वे प्रभावी ढंग से चर सुरक्षित भी हैं।

@interface AClass { 
    id _object; 
} 
@property (retain) id object; 
@end 

@implementation AClass 
@synthesize object = _object; 

- (void)doSomething:(id)object 
{ 
    [_object befriend:object]; 
} 
... 
बेशक

, "_" के रूप में पढ़ता यह बस के रूप में के रूप में "एक"/"एक" से पहले मानकों अरुचिकर हो सकता है "मेरे", इसलिए। उदाहरण के रूप में नामकरण सबसे अच्छा समाधान है और स्थानीय चर के अलग-अलग भूमिकाएं हैं, और उनके नामों को इसे प्रतिबिंबित करना चाहिए।

+2

वास्तव में, आप स्वयं-> ऑब्जेक्ट के साथ ivars तक पहुंच सकते हैं। इसके अलावा, ऐप्पल अपने स्वयं के उपयोग के लिए अंडरस्कोर उपसर्ग "रिजर्व" करता है, हालांकि कोई भी उस पर कोई ध्यान नहीं देता है। निजी तौर पर, मैं अपने आईवर के लिए उपसर्ग के रूप में i_ का उपयोग करता हूं, जो उन्हें गुणों से अलग करने में भी मदद करता है। –

+0

अंडरस्कोर जोड़ने से आपको '_object = something' और 'self.object = something' के बीच अंतर भी मिल जाता है जो कोड के दो पूरी तरह अलग बिट्स हैं। – kubi

+0

क्या होगा अगर प्रश्न में विधि वास्तव में आवृत्ति चर के लिए सेटटर है? कुछ अलग है? – Tony

13

आप self->object = object जैसे कुछ करने में सक्षम हो सकते हैं, लेकिन ऑब्जेक्टिव-सी कन्वेंशन (स्मॉलटाक से व्युत्पन्न) पैरामीटर को "ए" या "ए" के साथ पैराफिक्स करना है यदि पैरामीटर के पास एक आवृत्ति चर के समान नाम है।

+2

+1। सार्वजनिक कोको एपीआई उदाहरण चर से भिन्न करने के लिए "anObject" और "aDictionary" जैसे पैरामीटर नामों का उपयोग करते हैं। निम्नलिखित सम्मेलन के अलावा, यह दुर्घटना से गलत चर को संदर्भित करने की संभावना कम करता है, और कुछ हद तक आसान है। –

+0

यह ऐप्पल-अनुशंसित समाधान है, साथ ही यह एक अच्छा सम्मेलन है, आईएमओ। "- (शून्य) कुछ करो: (आईडी) anObject"। – andyvn22

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