जवाबों:
+
एक वर्ग विधि के लिए है और -
एक उदाहरण विधि के लिए है।
उदाहरण के लिए
// 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".
नहीं है वर्ग और उदाहरण विधियों के बीच अंतर के साथ काम कर एक और सवाल ।
@classmethod
और @method
भी या तो,। इतना तड़का क्यों ...?
(ए) वर्ग विधियों के लिए और (-) उदाहरण विधि के लिए,
(+) वर्ग विधियाँ: -
क्या ऐसी विधियाँ हैं जिन्हें स्थिर घोषित किया गया है। वर्ग का उदाहरण बनाए बिना विधि को बुलाया जा सकता है। वर्ग विधियाँ केवल कक्षा के सदस्यों पर ही संचालित हो सकती हैं और उदाहरण के सदस्यों पर नहीं क्योंकि वर्ग विधियाँ उदाहरण के सदस्यों से अनजान हैं। वर्ग के उदाहरण तरीकों को भी वर्ग विधि के भीतर से नहीं बुलाया जा सकता है जब तक कि उन्हें उस वर्ग के उदाहरण पर नहीं बुलाया जा रहा हो।
(-) उदाहरण विधियाँ: -
दूसरी ओर, कक्षा के एक उदाहरण की आवश्यकता होती है ताकि उन्हें बुलाया जाने से पहले मौजूद हो, इसलिए नए कीवर्ड का उपयोग करके कक्षा का एक उदाहरण बनाया जाना चाहिए। उदाहरण विधियाँ कक्षाओं के विशिष्ट उदाहरणों पर काम करती हैं। इंस्टेंस विधियों को स्थिर के रूप में घोषित नहीं किया गया है।
कैसे बनाएं?
@interface CustomClass : NSObject
+ (void)classMethod;
- (void)instanceMethod;
@end
कैसे इस्तेमाल करे?
[CustomClass classMethod];
CustomClass *classObject = [[CustomClass alloc] init];
[classObject instanceMethod];
+ विधियाँ वर्ग विधियाँ हैं - अर्थात्, ऐसी विधियाँ जिनका किसी उदाहरण के गुणों तक पहुँच नहीं है। वर्ग के लिए आबंटित या सहायक विधियों जैसे तरीकों के लिए उपयोग किया जाता है जिन्हें इंस्टेंस चर तक पहुंच की आवश्यकता नहीं होती है
- विधियाँ उदाहरण विधियाँ हैं - किसी वस्तु के एकल उदाहरण से संबंधित। आमतौर पर एक कक्षा में अधिकांश तरीकों के लिए उपयोग किया जाता है।
अधिक विवरण के लिए भाषा विशिष्टता देखें ।
self
, बल्कि क्लास होता है। वे बस एक उदाहरण के साथ जुड़े नहीं हैं, और विधि लुक-अप उदाहरण के माध्यम से नहीं है, लेकिन कक्षा के माध्यम से। फिर भी, आप कर सकते हैं+exchangeIVarOf: (MYObject*)a with: (MYObject*)b { MYObject* x = a->ivar; a->ivar = b->ivar; b->ivar = x; }
Apple की ओर से इसकी स्पष्ट व्याख्या 'मेथड्स एंड मैसेजिंग' सेक्शन के तहत की गई है:
संक्षेप में:
(विधि को तत्काल वर्ग होने के उदाहरण के बिना कहा जा सकता है)। तो आप इसे इस तरह कहते हैं:
[className classMethod];
आपको पहले किसी ऑब्जेक्ट को तुरंत करने की आवश्यकता है, फिर आप ऑब्जेक्ट पर विधि को कॉल कर सकते हैं)। आप किसी ऑब्जेक्ट को इस तरह से मैन्युअल रूप से इंस्टेंट कर सकते हैं:
SomeClass* myInstance = [[SomeClass alloc] init];
(यह अनिवार्य रूप से ऑब्जेक्ट के लिए मेमोरी स्पेस आवंटित करता है, फिर उस स्पेस में ऑब्जेक्ट को इनबिल्ट करता है - एक ओवरसिम्प्लीफिकेशन लेकिन इसके बारे में सोचने का एक अच्छा तरीका है। आप ऑब्जेक्ट को अलग से आवंटित कर सकते हैं और कभी भी ऐसा नहीं कर सकते हैं - यह पॉइंटर्स से संबंधित बुरा संबंध पैदा कर सकता है। और मेमोरी प्रबंधन)
फिर आवृत्ति विधि को कॉल करें:
[myInstance instanceMethod]
ऑब्जेक्टिव C में किसी ऑब्जेक्ट का उदाहरण प्राप्त करने का एक वैकल्पिक तरीका इस प्रकार है:
NSNumber *myNumber = [NSNumber numberWithInt:123];
जिसे NSNumber क्लास का 'नंबरविथ' क्लास मेथड कह रहा है , जो 'फैक्ट्री' मेथड है (यानी एक ऐसा तरीका जो आपको किसी ऑब्जेक्ट की 'रेडी मेड इंस्टेंस' प्रदान करता है)।
ऑब्जेक्टिव C विशेष वाक्य-विन्यास का उपयोग करते हुए सीधे कुछ ऑब्जेक्ट इंस्टेंसेस के निर्माण की अनुमति देता है, जैसे कि एक स्ट्रिंग के मामले में:
NSString * myStringInstance = @ "abc";