जवाबों:
जैसे अधिकांश अन्य जवाबों में कहा गया है, उदाहरण के तरीके एक वर्ग के उदाहरण का उपयोग करते हैं, जबकि एक वर्ग पद्धति का उपयोग सिर्फ कक्षा के नाम के साथ किया जा सकता है। उद्देश्य-सी में वे इस प्रकार परिभाषित होते हैं:
@interface MyClass : NSObject
+ (void)aClassMethod;
- (void)anInstanceMethod;
@end
वे तो इस तरह इस्तेमाल किया जा सकता है:
[MyClass aClassMethod];
MyClass *object = [[MyClass alloc] init];
[object anInstanceMethod];
क्लास के तरीकों के कुछ वास्तविक दुनिया उदाहरण कई फाउंडेशन कक्षाओं की सुविधा विधियां हैं जैसे NSString
's +stringWithFormat:
या NSArray
' s +arrayWithArray:
। एक उदाहरण तरीका होगा NSArray
की -count
विधि।
सभी तकनीकी विवरणों को अन्य उत्तरों में अच्छी तरह से कवर किया गया है। मैं बस एक सरल सादृश्य साझा करना चाहता हूं जो मुझे लगता है कि अच्छी तरह से एक वर्ग और एक उदाहरण के बीच के अंतर को दिखाता है:
एक वर्ग एक घर के खाके की तरह है : आपके पास केवल एक खाका है और (आमतौर पर) आप अकेले खाका के साथ ऐसा नहीं कर सकते।
एक उदाहरण (या एक वस्तु ) वास्तविक घर है जिसे आप ब्लूप्रिंट के आधार पर बनाते हैं: आप एक ही ब्लूप्रिंट से बहुत सारे घर बना सकते हैं। फिर आप प्रत्येक घरों में दीवारों को एक अलग रंग में रंग सकते हैं, जिस तरह आप स्वतंत्र रूप से एक वर्ग के प्रत्येक उदाहरण के गुणों को अन्य उदाहरणों को प्रभावित किए बिना बदल सकते हैं।
difference between class method and an instance method
;
जैसे अन्य उत्तरों ने कहा है, उदाहरण विधियाँ किसी वस्तु पर काम करती हैं और उसके उदाहरण चर तक पहुँच होती है, जबकि एक वर्ग विधि एक वर्ग पर एक पूरे के रूप में काम करती है और किसी विशेष उदाहरण के चर तक उसकी पहुँच नहीं होती है (जब तक कि आप उदाहरण के रूप में उदाहरण नहीं देते हैं। पैरामीटर)।
एक वर्ग विधि का एक अच्छा उदाहरण एक काउंटर-प्रकार विधि है, जो एक वर्ग के उदाहरणों की कुल संख्या लौटाता है। क्लास के तरीके ए से शुरू होते हैं +
, जबकि उदाहरण ए से शुरू होते हैं -
। उदाहरण के लिए:
static int numberOfPeople = 0;
@interface MNPerson : NSObject {
int age; //instance variable
}
+ (int)population; //class method. Returns how many people have been made.
- (id)init; //instance. Constructs object, increments numberOfPeople by one.
- (int)age; //instance. returns the person age
@end
@implementation MNPerson
- (id)init{
if (self = [super init]){
numberOfPeople++;
age = 0;
}
return self;
}
+ (int)population{
return numberOfPeople;
}
- (int)age{
return age;
}
@end
main.m:
MNPerson *micmoo = [[MNPerson alloc] init];
MNPerson *jon = [[MNPerson alloc] init];
NSLog(@"Age: %d",[micmoo age]);
NSLog(@"%Number Of people: %d",[MNPerson population]);
आउटपुट: आयु: 0 लोगों की संख्या: 2
एक अन्य उदाहरण है यदि आपके पास एक ऐसा तरीका है जिसे आप चाहते हैं कि उपयोगकर्ता कॉल करने में सक्षम हो, तो कभी-कभी इसे एक क्लास विधि बनाने के लिए अच्छा है। उदाहरण के लिए, यदि आपके पास MathFunctions नामक एक वर्ग है, तो आप यह कर सकते हैं:
+ (int)square:(int)num{
return num * num;
}
तो फिर उपयोगकर्ता कॉल करेगा:
[MathFunctions square:34];
कभी भी क्लास को इंस्टेंट किए बिना!
आप NSArray की तरह, ऑटोरेल्ड ऑब्जेक्ट वापस करने के लिए क्लास फ़ंक्शंस का भी उपयोग कर सकते हैं
+ (NSArray *)arrayWithObject:(id)object
यह एक वस्तु लेता है, इसे एक सरणी में रखता है, और सरणी का एक ऑटोरेल्ड संस्करण लौटाता है जिसे मेमोरी प्रबंधित करने की आवश्यकता नहीं होती है, टेम्पोररी सरणियों के लिए महान और क्या नहीं।
मुझे उम्मीद है कि अब आप समझ गए होंगे कि आपको कक्षा के तरीकों का उपयोग कब और क्यों करना चाहिए !!
एक इंस्टेंस विधि कक्षा के उदाहरण (यानी एक ऑब्जेक्ट) पर लागू होती है जबकि एक क्लास विधि क्लास पर ही लागू होती है।
C # में एक वर्ग विधि को स्टैटिक के रूप में चिह्नित किया गया है। विधियों और गुणों को चिह्नित नहीं किया जाता है उदाहरण के तरीके हैं।
class Foo {
public static void ClassMethod() { ... }
public void InstanceMethod() { ... }
}
आपके प्रश्न का उत्तर वस्तुनिष्ठ-सी के लिए विशिष्ट नहीं है, हालाँकि विभिन्न भाषाओं में, क्लास के तरीकों को स्टैटिक तरीके कहा जा सकता है।
वर्ग विधियों और उदाहरण विधियों के बीच का अंतर है
कक्षा के तरीके
उदाहरण के तरीके
मुझे लगता है कि इसे समझने का सबसे अच्छा तरीका है कि इसे देखें alloc
और init
। यह वह स्पष्टीकरण था जिसने मुझे मतभेदों को समझने की अनुमति दी।
कक्षा विधि
कक्षा के लिए एक कक्षा पद्धति को समग्र रूप से लागू किया जाता है। यदि आप alloc
विधि की जाँच करते हैं , तो यह एक वर्ग विधि है जिसे निरूपित किया जाता है+
तो विधि घोषणा से पहले । यह एक वर्ग विधि है क्योंकि इसे उस वर्ग का एक विशिष्ट उदाहरण बनाने के लिए कक्षा में लागू किया जाता है।
उदाहरण विधि
आप किसी वर्ग के विशिष्ट उदाहरण को संशोधित करने के लिए एक आवृत्ति विधि का उपयोग करते हैं, जो कि पूरे वर्ग के बजाय उस उदाहरण के लिए अद्वितीय है। init
उदाहरण के लिए ( -
विधि की घोषणा से पहले के साथ चिह्नित ), एक उदाहरण विधि है क्योंकि आप सामान्य रूप से उस वर्ग के गुणों को संशोधित कर रहे हैं जिसके साथ इसे बनाया गया है alloc
।
उदाहरण
NSString *myString = [NSString alloc];
आप alloc
उस वर्ग का उदाहरण उत्पन्न करने के लिए कक्षा विधि को बुला रहे हैं । ध्यान दें कि संदेश का रिसीवर एक वर्ग कैसे है।
[myString initWithFormat:@"Hope this answer helps someone"];
आप उस उदाहरण पर कुछ गुण सेट करके NSString
कॉल की आवृत्ति को संशोधित कर रहे हैं myString
। ध्यान दें कि संदेश का रिसीवर एक उदाहरण (कक्षा की वस्तु NSString
) कैसे है।
alloc
ऑब्जेक्ट के लिए पर्याप्त मेमोरी आवंटित करता है, ऑब्जेक्ट init
की स्थिति को परिभाषित करने के लिए उन मेमोरी एड्रेस में क्या बदलाव करेगा। हम किसी वस्तु को तब तक संशोधित नहीं कर सकते जब तक उसमें संशोधन करने के लिए कोई स्थान न हो, इसलिए हम alloc
उस वर्ग का उपयोग करते हैं जो यह तय करेगा कि हमें वह स्थान दिया जाएगा।
क्लास के तरीकों का इस्तेमाल आमतौर पर उस क्लास के उदाहरण बनाने के लिए किया जाता है
उदाहरण के लिए, उस पैरामीटर के साथ [NSString stringWithFormat:@"SomeParameter"];
एक NSString
उदाहरण देता है जो इसे भेजा जाता है। इसलिए, क्योंकि यह एक वर्ग विधि है जो अपने प्रकार की एक वस्तु लौटाती है, इसे एक सुविधा विधि भी कहा जाता है।
इसलिए अगर मैं इसे सही तरीके से समझूं।
किसी class
विधि का उपयोग करने / उसे संसाधित करने के लिए आपको उस ऑब्जेक्ट का उदाहरण आवंटित करने की आवश्यकता नहीं है। एक class
विधि स्वयं निहित है और उस वर्ग के किसी भी वस्तु की स्थिति की निर्भरता के बिना काम कर सकती है। एclass
विधि से अपेक्षा की जाती है कि वह अपने सभी कामों के लिए मेमोरी आवंटित करे और जब काम करे, तब तक उस वर्ग का कोई भी उदाहरण पिछली कॉल में आवंटित किसी भी मेमोरी को क्लास विधि से मुक्त नहीं कर सकेगा।
एक instance
विधि इसके ठीक विपरीत है। जब तक आप उस वर्ग का एक उदाहरण आवंटित नहीं करते, आप उसे कॉल नहीं कर सकते। यह एक सामान्य वर्ग की तरह है जिसमें एक कंस्ट्रक्टर है और एक विध्वंसक हो सकता है (जो सभी आवंटित मेमोरी को साफ करता है)।
सबसे अधिक संभावना में (जब तक आप एक पुन: प्रयोज्य पुस्तकालय नहीं लिख रहे हैं, आपको class
चर की आवश्यकता नहीं होनी चाहिए ।
उदाहरण के लिए एक गेम लें जिसमें बहुत सारी कारें हैं। जब एक कार को तत्काल किया जाता है, तो यह एक कॉल करता है
[CCar registerCar:self]
तो CCar वर्ग, हर CCar की एक सूची को तत्काल बना सकता है। मान लें कि उपयोगकर्ता एक स्तर पूरा करता है, और सभी कारों को निकालना चाहता है ... आप या तो कर सकते हैं: 1- मैन्युअल रूप से आपके द्वारा बनाए गए प्रत्येक CCar की एक सूची से गुजरें, और whicheverCar.remove();
CCar के लिए एक रिमार्कर विधि जोड़ें, जो ऐसा करेगा आपके लिए जब आप कॉल करते हैं [CCar removeAllCars]। अर्थात allCars[n].remove();
या उदाहरण के लिए, आप उपयोगकर्ता को पूरे ऐप के लिए एक डिफ़ॉल्ट फ़ॉन्ट आकार निर्दिष्ट करने की अनुमति देते हैं, जो स्टार्टअप पर लोड और सहेजा जाता है। वर्ग विधि के बिना, आपको कुछ ऐसा करना पड़ सकता है
fontSize = thisMenu.getParent().fontHandler.getDefaultFontSize();
वर्ग विधि के साथ, आप दूर हो सकते हैं [FontHandler getDefaultFontSize]
।
आपके रिमूवल फ़ंक्शन के लिए, आप पाएंगे कि C # जैसी भाषाएं वास्तव में कुछ विधियों जैसे कि टोलर या टूपर के साथ हैं।
उदा। myString.removeVowels()
और String.removeVowels(myString)
(ओ.बी.जे.सी. में [String removeVowels:myString]
)।
इस मामले में उदाहरण की संभावना वर्ग विधि कहती है, इसलिए दोनों उपलब्ध हैं। अर्थात
public function toLower():String{
return String.toLower();
}
public static function toLower( String inString):String{
//do stuff to string..
return newString;
}
मूल रूप से, myString.toLower()
कॉल [String toLower:ownValue]
इसका कोई निश्चित उत्तर नहीं है, लेकिन अगर आपको ऐसा लगता है कि किसी क्लास मेथड को shoving करने से आपका कोड बेहतर हो जाएगा, तो इसे शॉट दें, और यह ध्यान रखें कि एक क्लास मेथड आपको केवल अन्य क्लास मेथड्स / वैरिएबल का उपयोग करने देगा।
कक्षा के तरीके
ऐसी विधियाँ हैं जिन्हें स्थैतिक घोषित किया जाता है। वर्ग का उदाहरण बनाए बिना विधि को बुलाया जा सकता है। वर्ग विधियाँ केवल कक्षा के सदस्यों पर ही संचालित हो सकती हैं और उदाहरण के सदस्यों पर नहीं क्योंकि वर्ग विधियाँ उदाहरण के सदस्यों से अनजान हैं। वर्ग के उदाहरण तरीकों को भी वर्ग विधि के भीतर से नहीं बुलाया जा सकता है जब तक कि उन्हें उस वर्ग के उदाहरण पर नहीं बुलाया जा रहा हो।
उदाहरण के तरीके
दूसरी ओर कक्षा के एक उदाहरण की आवश्यकता होती है ताकि उन्हें बुलाया जाने से पहले मौजूद हो, इसलिए नए कीवर्ड का उपयोग करके कक्षा का एक उदाहरण बनाया जाना चाहिए। उदाहरण विधियाँ कक्षाओं के विशिष्ट उदाहरणों पर काम करती हैं। इंस्टेंस विधियों को स्थिर के रूप में घोषित नहीं किया गया है।
ऑब्जेक्टिव-सी में सभी विधियाँ "-" या "+" वर्ण से शुरू होती हैं। उदाहरण:
@interface MyClass : NSObject
// instance method
- (void) instanceMethod;
+ (void) classMethod;
@end
"+" और "-" वर्ण निर्दिष्ट करते हैं कि क्या कोई विधि एक class method
या एक instance method
क्रमशः है।
यदि हम इन विधियों को कहते हैं तो अंतर स्पष्ट होगा। यहां तरीकों को घोषित किया गया है MyClass
।
instance method
कक्षा के एक उदाहरण की आवश्यकता होती है:
MyClass* myClass = [[MyClass alloc] init];
[myClass instanceMethod];
अंदर MyClass
अन्य तरीकों का MyClass
उपयोग करने के उदाहरण के तरीकों को कॉल कर सकते हैं self
:
-(void) someMethod
{
[self instanceMethod];
}
लेकिन, class methods
वर्ग पर ही बुलाया जाना चाहिए:
[MyClass classMethod];
या:
MyClass* myClass = [[MyClass alloc] init];
[myClass class] classMethod];
यह काम नहीं करेगा:
// Error
[myClass classMethod];
// Error
[self classMethod];
एक वर्ग विधि आम तौर पर या तो कक्षा का एक नया उदाहरण बनाती है या कक्षा के कुछ वैश्विक गुणों को पुनः प्राप्त करती है। क्लास मेथड्स इंस्टेंस पर काम नहीं करते हैं या इंस्टेंस वैरिएबल की कोई एक्सेस नहीं है।
एक आवृत्ति विधि वर्ग के किसी विशेष उदाहरण पर कार्य करती है। उदाहरण के लिए, आपके द्वारा कार्यान्वित एक्सेसर्स विधि सभी आवृत्ति विधियाँ हैं। आप किसी विशेष ऑब्जेक्ट के उदाहरण चर सेट करने या प्राप्त करने के लिए उनका उपयोग करते हैं।
एक इंस्टेंस विधि लागू करने के लिए, आप मैसेज को क्लास के एक इंस्टेंस पर भेजते हैं।
कक्षा पद्धति लागू करने के लिए, आप कक्षा को सीधे संदेश भेजते हैं।
स्रोत: IOS - ऑब्जेक्टिव-सी - क्लास मेथड्स एंड इंस्टेंस मेथड्स
कक्षा के तरीके किसी भी उदाहरण चर के मूल्य को बदल या जान नहीं सकते। यह जानने के लिए मानदंड होना चाहिए कि क्या कोई उदाहरण विधि एक वर्ग विधि हो सकती है।
यह भी याद रखें, एक ही विचार चर पर लागू होता है। जब आप तरीकों / कार्यों के लिए वैरिएबल के बारे में बात कर रहे हैं, तो आप स्थिर, सदस्य, उदाहरण, वर्ग और इतने पर आ जाएंगे।
ऐसा लगता है कि ओब्ज-सी समुदाय में सामान्य शब्द आइवर चर के लिए है, लेकिन मैं अभी तक ओब्ज-सी लड़का नहीं हूं।
उपरोक्त उत्तरों के लिए एक अपडेट, मैं मानता हूं कि इंस्टेंस मेथड एक क्लास के इंस्टेंस का उपयोग करते हैं, जबकि एक क्लास मेथड को सिर्फ क्लास के नाम के साथ इस्तेमाल किया जा सकता है।
उद्देश्य-सी में स्वत: संदर्भ गणना के अस्तित्व में आने के बाद आवृत्ति विधि और वर्ग विधि के बीच कोई अंतर नहीं है।
उदाहरण के लिए [NS StringWithformat:..]
एक वर्ग विधि और [[NSString alloc] initwihtformat:..]
एक आवृत्ति विधि, दोनों एआरसी के बाद समान हैं
नोट: यह केवल छद्म कोड प्रारूप में है
कक्षा विधि
संकलन के समय लगभग सभी को इसकी आवश्यकता होती है । इसके लिए किसी उपयोगकर्ता इनपुट की आवश्यकता नहीं है, न ही इसकी गणना एक उदाहरण पर आधारित है। इसके बारे में सब कुछ वर्ग / ब्लूप्रिंट पर आधारित है - जो अद्वितीय है यानी आपके पास एक क्लास के लिए कई ब्लूप्रिंट नहीं हैं। क्या आपके पास संकलन समय के दौरान विभिन्न विविधताएं हो सकती हैं? नहीं, इसलिए कक्षा अद्वितीय है और इसलिए कोई बात नहीं है कि आप कितनी बार कक्षा पद्धति को कॉल करते हैं, यह इंगित करने वाला सूचक समान होगा।
PlanetOfLiving: return @"Earth" // No matter how many times you run this method...nothing changes.
उदाहरण विधि
इसके विपरीत उदाहरण विधि रनटाइम के दौरान होती है, क्योंकि यह केवल तब होता है कि आपने एक ऐसी चीज का एक उदाहरण बनाया है जो हर पल पर भिन्न हो सकती है।
initWithName: @"John" lastName: @"Doe"Age:12 @"cool"
initWithName: @"Donald" lastName: @"Drumpf"Age:5 attitude:@"He started"
initWithName: @"President" lastName: @"Obama"Age:54 attitude: @"Awesome"
//As you can see the value can change for each instance.
यदि आप अन्य भाषाओं से आ रहे हैं तो स्टैटिक विधियां कक्षा के तरीकों के समान हैं।
यदि आप स्विफ्ट से आ रहे हैं, तो टाइप तरीके क्लास के तरीकों के समान हैं।
उपरोक्त उत्तरों को जोड़ना
क्लास विधि कक्षा पर काम करेगी, हम इसे सामान्य उद्देश्य के लिए उपयोग करेंगे, जैसे + stringWithFormat, वर्ग का आकार और सबसे महत्वपूर्ण init आदि।
NSString *str = [NSString stringWithFormat:@"%.02f%%",someFloat];
इंस्टैंस मेथड एक क्लास के इंस्टेंस पर काम करेगा, न कि एक क्लास पर, जैसे हम दो व्यक्ति हैं और हम प्रत्येक के बैलेंस को अलग-अलग जानना चाहते हैं। क्योंकि यह सामान्य प्रतिक्रिया नहीं लौटाएगा। जैसे NSSArray आदि की गिनती निर्धारित करना।
[johnson getAccountBalance];
[ankit getAccountBalance];