एक विधि के आगे उद्देश्य-सी में प्लस और माइनस संकेतों का क्या मतलब है?


180

ऑब्जेक्टिव-सी में, मैं जानना चाहूंगा कि विधि की परिभाषा के आगे क्या +और -संकेत हैं।

- (void)loadPluginsAtPath:(NSString*)pluginPath errors:(NSArray **)errors;

जवाबों:


226

+एक वर्ग विधि के लिए है और -एक उदाहरण विधि के लिए है।

उदाहरण के लिए

// Not actually Apple's code.
@interface NSArray : NSObject {
}
+ (NSArray *)array;
- (id)objectAtIndex:(NSUInteger)index;
@end

// somewhere else:

id myArray = [NSArray array];         // see how the message is sent to NSArray?
id obj = [myArray objectAtIndex:4];   // here the message is sent to myArray

// Btw, in production code one uses "NSArray *myArray" instead of only "id".

नहीं है वर्ग और उदाहरण विधियों के बीच अंतर के साथ काम कर एक और सवाल


63
यह लगभग वैसा ही है जैसे "स्थिर" के अतिरिक्त पाँच पात्र किसी तरह उनके लिए बहुत अधिक हैं।
आनन।

23
@ तोप: तरीके स्थिर नहीं हैं। वे वर्ग विधियां हैं। उन्हें ओवरराइड किया जा सकता है और वे वर्ग पदानुक्रम का एक हिस्सा हैं। स्थिर का अर्थ है सी। में कुछ बहुत भिन्न
bbum

4
@ एवॉन, जो आपके लिए सेब है, वे अपने कैमरे पर एक फ्लैश भी छोड़ देंगे, और उनके चूहों पर एक सही बटन। =)
पोकस्टेड

13
@bbum पैसे पर है। तथ्य यह है कि जावा ने "स्टेटिक" कीवर्ड को कुछ अलग करने के लिए पुन: विनियोजित किया, यह बहुत पुराने सी की गलती नहीं है। जबकि इसका उपयोग पूरी तरह से सी में सहज नहीं हो सकता है, यह जावा में भी कम लगता है। मुझे उम्मीद है कि स्टेटिक डायनेमिक के विपरीत होगा - ऐसा कुछ जो बदलता नहीं है। और निश्चित रूप से, ऑब्जेक्टिव-सी भाषा लगभग 15 वर्षों के लिए थी, इससे पहले कि एप्पल ने इसे ओएस एक्स में अपनाया था।
क्विन टेलर

3
स्थिर और एक वर्ग विधि के बीच का अंतर: MYBaseClass और उसके उपवर्ग MYSubClass में विधि + foo को परिभाषित करें। NSArray * कक्षाएं = @ [[MYBaseClass class], [MYSubClass class]]; [कक्षाएं makeObjectsPerformSelector: @selector (foo)]; स्थैतिक विधि से काम नहीं करेगा। यही कारण है कि कहा, मैं एक वरीय would'a @classmethodऔर @methodभी या तो,। इतना तड़का क्यों ...?
uliwitness

45

(ए) वर्ग विधियों के लिए और (-) उदाहरण विधि के लिए,

(+) वर्ग विधियाँ: -

क्या ऐसी विधियाँ हैं जिन्हें स्थिर घोषित किया गया है। वर्ग का उदाहरण बनाए बिना विधि को बुलाया जा सकता है। वर्ग विधियाँ केवल कक्षा के सदस्यों पर ही संचालित हो सकती हैं और उदाहरण के सदस्यों पर नहीं क्योंकि वर्ग विधियाँ उदाहरण के सदस्यों से अनजान हैं। वर्ग के उदाहरण तरीकों को भी वर्ग विधि के भीतर से नहीं बुलाया जा सकता है जब तक कि उन्हें उस वर्ग के उदाहरण पर नहीं बुलाया जा रहा हो।

(-) उदाहरण विधियाँ: -

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

कैसे बनाएं?

@interface CustomClass : NSObject

+ (void)classMethod;
- (void)instanceMethod;

@end

कैसे इस्तेमाल करे?

[CustomClass classMethod];

CustomClass *classObject = [[CustomClass alloc] init];
[classObject instanceMethod];

18

+ विधियाँ वर्ग विधियाँ हैं - अर्थात्, ऐसी विधियाँ जिनका किसी उदाहरण के गुणों तक पहुँच नहीं है। वर्ग के लिए आबंटित या सहायक विधियों जैसे तरीकों के लिए उपयोग किया जाता है जिन्हें इंस्टेंस चर तक पहुंच की आवश्यकता नहीं होती है

- विधियाँ उदाहरण विधियाँ हैं - किसी वस्तु के एकल उदाहरण से संबंधित। आमतौर पर एक कक्षा में अधिकांश तरीकों के लिए उपयोग किया जाता है।

अधिक विवरण के लिए भाषा विशिष्टता देखें ।


ठीक है, वास्तव में क्लास के तरीकों में इंस्टेंस वेरिएबल्स तक पहुंच होती है, उनके पास सिर्फ एक इंस्टेंस नहीं होता है self, बल्कि क्लास होता है। वे बस एक उदाहरण के साथ जुड़े नहीं हैं, और विधि लुक-अप उदाहरण के माध्यम से नहीं है, लेकिन कक्षा के माध्यम से। फिर भी, आप कर सकते हैं+exchangeIVarOf: (MYObject*)a with: (MYObject*)b { MYObject* x = a->ivar; a->ivar = b->ivar; b->ivar = x; }
ulvitness

5

Apple की ओर से इसकी स्पष्ट व्याख्या 'मेथड्स एंड मैसेजिंग' सेक्शन के तहत की गई है:

https://developer.apple.com/library/mac/referencelibrary/GettingStarted/RoadMapOSX/books/WriteObjective-CCode/WriteObjective-CCode/WriteObjective-CCode.html

संक्षेप में:

+ का अर्थ है 'वर्ग विधि'

(विधि को तत्काल वर्ग होने के उदाहरण के बिना कहा जा सकता है)। तो आप इसे इस तरह कहते हैं:

[className classMethod]; 


- 'उदाहरण विधि'

आपको पहले किसी ऑब्जेक्ट को तुरंत करने की आवश्यकता है, फिर आप ऑब्जेक्ट पर विधि को कॉल कर सकते हैं)। आप किसी ऑब्जेक्ट को इस तरह से मैन्युअल रूप से इंस्टेंट कर सकते हैं:

SomeClass* myInstance = [[SomeClass alloc] init];

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

फिर आवृत्ति विधि को कॉल करें:

[myInstance instanceMethod]

ऑब्जेक्टिव C में किसी ऑब्जेक्ट का उदाहरण प्राप्त करने का एक वैकल्पिक तरीका इस प्रकार है:

NSNumber *myNumber = [NSNumber numberWithInt:123];

जिसे NSNumber क्लास का 'नंबरविथ' क्लास मेथड कह रहा है , जो 'फैक्ट्री' मेथड है (यानी एक ऐसा तरीका जो आपको किसी ऑब्जेक्ट की 'रेडी मेड इंस्टेंस' प्रदान करता है)।

ऑब्जेक्टिव C विशेष वाक्य-विन्यास का उपयोग करते हुए सीधे कुछ ऑब्जेक्ट इंस्टेंसेस के निर्माण की अनुमति देता है, जैसे कि एक स्ट्रिंग के मामले में:

NSString * myStringInstance = @ "abc";

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.