वर्ग और उदाहरण के तरीकों के बीच अंतर क्या है?


448

एक वर्ग विधि और एक उदाहरण विधि के बीच अंतर क्या है?

उदाहरण के तरीके ऐक्सेसर्स (गेटर्स एंड सेटर्स) हैं जबकि क्लास मेथड्स बाकी सब कुछ बहुत ज्यादा हैं?

जवाबों:


673

जैसे अधिकांश अन्य जवाबों में कहा गया है, उदाहरण के तरीके एक वर्ग के उदाहरण का उपयोग करते हैं, जबकि एक वर्ग पद्धति का उपयोग सिर्फ कक्षा के नाम के साथ किया जा सकता है। उद्देश्य-सी में वे इस प्रकार परिभाषित होते हैं:

@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विधि।


7
अच्छा उत्तर। यह भी ध्यान देने योग्य है कि आप विधियों का वर्णन करने के लिए एक विशेष शॉर्टहैंड नोटेशन देखेंगे। उदाहरण के लिए, + [NSString stringWithFormat:] वर्ग विधि है + stringWithFormat: NSString पर; - [NSArray objectAtIndex:] एक उदाहरण विधि है। कई चयनकर्ता भागों के साथ तरीके लिखे गए हैं - [NSMutableDictionary setObject: forKey:] आदि। आप अक्सर कोकोआ प्रतिक्रियाओं, प्रलेखन और Xcode में इस अंकन को देखेंगे।
क्विन टेलर

149
मैं यह जोड़ना चाहूंगा कि कई अन्य भाषाओं में एक वर्ग विधि को "स्थिर" विधि कहा जाता है। और मूल प्रश्न का उत्तर देने के लिए, एक्सेसर्स उदाहरण के तरीके हैं क्योंकि वे एक विशिष्ट उदाहरण की स्थिति को सेट और प्राप्त कर रहे हैं। उपरोक्त उदाहरण में, NSArray गणना एक विशिष्ट उदाहरण में वस्तुओं की संख्या लौटाती है।
ब्रायन पैन

2
"जबकि एक क्लास पद्धति का उपयोग सिर्फ क्लास के नाम के साथ किया जा सकता है।" या कक्षा वस्तु
user102008

2
मेरी उत्तेजना के लिए खेद है ... लेकिन मैंने सिर्फ अंतर और इसकी क्षमता को सीखा है। क्लास मेथड रॉक और इसी तरह सिंगलटन क्लासेस! ufff मुझे प्यार हो गया है! <3
पावन

2
@BrianPan स्थिर और वर्ग विधियाँ समान नहीं हैं। वे समान हैं लेकिन अलग-अलग नाम रखने का कारण यह है कि वे अलग तरह से काम करते हैं। उदाहरण के लिए, स्थैतिक तरीकों को ओवरराइड नहीं किया जा सकता है।
सुल्तान

190

सभी तकनीकी विवरणों को अन्य उत्तरों में अच्छी तरह से कवर किया गया है। मैं बस एक सरल सादृश्य साझा करना चाहता हूं जो मुझे लगता है कि अच्छी तरह से एक वर्ग और एक उदाहरण के बीच के अंतर को दिखाता है:

यहां छवि विवरण दर्ज करें

एक वर्ग एक घर के खाके की तरह है : आपके पास केवल एक खाका है और (आमतौर पर) आप अकेले खाका के साथ ऐसा नहीं कर सकते।

यहां छवि विवरण दर्ज करें

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


6
@JohannesFahrenkrug अच्छी तरह से यहाँ वर्ग और वस्तु के लिए अवधारणा की व्याख्या की है। वास्तविक प्रश्न के लिए नहीं है difference between class method and an instance method ;
शेखु

1
कक्षा के कक्षा बनाम उदाहरण की सही व्याख्या। कक्षाएं newbies के लिए एक अजीब अवधारणा हैं और यह इसे अपने सबसे मौलिक तरीके से समझाती है।
एलेक्स मैकफरसन

1
@JohannesFahrenkrug वास्तव में एक अच्छी व्याख्या है, जिसने मुझे यह सोचने पर
मजबूर कर दिया कि

1
इस तरह के एक महान स्पष्टीकरण :)
प्रवीणकुमार

1
अच्छी उपमा। कृपया किसी को इस आदमी को एक वर्ष की आपूर्ति पिज्जा दे।
जिनेकोड

102

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

एक वर्ग विधि का एक अच्छा उदाहरण एक काउंटर-प्रकार विधि है, जो एक वर्ग के उदाहरणों की कुल संख्या लौटाता है। क्लास के तरीके ए से शुरू होते हैं +, जबकि उदाहरण ए से शुरू होते हैं -। उदाहरण के लिए:

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

यह एक वस्तु लेता है, इसे एक सरणी में रखता है, और सरणी का एक ऑटोरेल्ड संस्करण लौटाता है जिसे मेमोरी प्रबंधित करने की आवश्यकता नहीं होती है, टेम्पोररी सरणियों के लिए महान और क्या नहीं।

मुझे उम्मीद है कि अब आप समझ गए होंगे कि आपको कक्षा के तरीकों का उपयोग कब और क्यों करना चाहिए !!


1
micmoo, क्या मैं आपको "स्थिर int नंबरऑफपीस = 0;" लगाने का सुझाव दे सकता हूं। कोड स्वरूपित पाठ में? जब तक मैंने इसे नमूना कोड के ऊपर नहीं देखा, मैं भ्रमित था। उसके अलावा, वास्तव में संक्षिप्त जवाब।
मोबिबोब

2
मेरे नौसिखिया भ्रम को क्षमा करें, लेकिन आपको "आयु" और उदाहरण विधि "आयु" दोनों चर की आवश्यकता क्यों है? उदाहरण के लिए गेट्टर और सेटर नहीं होगा "आयु" @synthetize के साथ बनाया जा सकता है?
selytch

सिंथेसाइज़ का उपयोग करने के लिए @selytch "आयु" को एक संपत्ति के रूप में परिभाषित किया जाना चाहिए।
15 अक्टूबर को micah94

36

एक इंस्टेंस विधि कक्षा के उदाहरण (यानी एक ऑब्जेक्ट) पर लागू होती है जबकि एक क्लास विधि क्लास पर ही लागू होती है।

C # में एक वर्ग विधि को स्टैटिक के रूप में चिह्नित किया गया है। विधियों और गुणों को चिह्नित नहीं किया जाता है उदाहरण के तरीके हैं।

class Foo {
  public static void ClassMethod() { ... }
  public void InstanceMethod() { ... }
}

1
अर्घ - क्षमा करें, मैंने अभी देखा कि यह ओब्ज-सी प्रश्न था। उम्मीद है कि मेरा जवाब अभी भी लागू होता है लेकिन कृपया वोट करें या हटाने के लिए वोट करें।
रॉबर्ट हॉर्विक

6
कोई नुकसान नहीं किया। आपके उत्तर का पहला भाग सामान्य OOP सिद्धांत के रूप में सही है, और यह निश्चित रूप से Objective-C पर लागू होता है। यदि आप ऐसे प्रश्नों को देखना नहीं चाहते हैं, तो अनदेखा करने के लिए आप टैग की अपनी सूची में "उद्देश्य-सी" जोड़ सकते हैं, हालांकि कोई भी भागीदारी निश्चित रूप से स्वागत योग्य है। :-)
क्विन टेलर

16

आपके प्रश्न का उत्तर वस्तुनिष्ठ-सी के लिए विशिष्ट नहीं है, हालाँकि विभिन्न भाषाओं में, क्लास के तरीकों को स्टैटिक तरीके कहा जा सकता है।

वर्ग विधियों और उदाहरण विधियों के बीच का अंतर है

कक्षा के तरीके

  • कक्षा चर पर संचालित करें (वे उदाहरण चर तक नहीं पहुंच सकते हैं)
  • लागू होने के लिए किसी वस्तु की तुरंत आवश्यकता नहीं है
  • कभी-कभी एक कोड गंध हो सकता है (कुछ लोग जो ओओपी के लिए नए हैं, एक ओओ एनवायरमेंट में संरचित प्रोग्रामिंग करने के लिए एक बैसाखी के रूप में उपयोग करते हैं)

उदाहरण के तरीके

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

उदाहरण विधियाँ वर्ग चर पर काम कर सकती हैं?

16

मुझे लगता है कि इसे समझने का सबसे अच्छा तरीका है कि इसे देखें allocऔर init। यह वह स्पष्टीकरण था जिसने मुझे मतभेदों को समझने की अनुमति दी।

कक्षा विधि

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

उदाहरण विधि

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

उदाहरण

NSString *myString = [NSString alloc];

आप allocउस वर्ग का उदाहरण उत्पन्न करने के लिए कक्षा विधि को बुला रहे हैं । ध्यान दें कि संदेश का रिसीवर एक वर्ग कैसे है।

[myString initWithFormat:@"Hope this answer helps someone"];

आप उस उदाहरण पर कुछ गुण सेट करके NSStringकॉल की आवृत्ति को संशोधित कर रहे हैं myString। ध्यान दें कि संदेश का रिसीवर एक उदाहरण (कक्षा की वस्तु NSString) कैसे है।


"आबंटित" विधि की जाँच से आपका क्या अभिप्राय है? क्या आप मुझे दस्तावेज़ में एक विशिष्ट स्थान पर इंगित कर सकते हैं? (संपादित करें) -> आह, कोई बात नहीं, NSObject डॉक्स में हाँ, यह कहता है कि "कार्य" के तहत - developer.apple.com/library/ios/documentation/cocoa/reference/…
ईथन पार्कर

आपको वास्तव में यह समझने की ज़रूरत नहीं है कि यह वास्तव में इसे समझने के लिए क्या करता है, बस इसे कक्षा पर लागू किया जाता है। सीधे शब्दों में कहें: allocऑब्जेक्ट के लिए पर्याप्त मेमोरी आवंटित करता है, ऑब्जेक्ट initकी स्थिति को परिभाषित करने के लिए उन मेमोरी एड्रेस में क्या बदलाव करेगा। हम किसी वस्तु को तब तक संशोधित नहीं कर सकते जब तक उसमें संशोधन करने के लिए कोई स्थान न हो, इसलिए हम allocउस वर्ग का उपयोग करते हैं जो यह तय करेगा कि हमें वह स्थान दिया जाएगा।
एडम वाइट

6

क्लास के तरीकों का इस्तेमाल आमतौर पर उस क्लास के उदाहरण बनाने के लिए किया जाता है

उदाहरण के लिए, उस पैरामीटर के साथ [NSString stringWithFormat:@"SomeParameter"];एक NSStringउदाहरण देता है जो इसे भेजा जाता है। इसलिए, क्योंकि यह एक वर्ग विधि है जो अपने प्रकार की एक वस्तु लौटाती है, इसे एक सुविधा विधि भी कहा जाता है।


6

इसलिए अगर मैं इसे सही तरीके से समझूं।

किसी classविधि का उपयोग करने / उसे संसाधित करने के लिए आपको उस ऑब्जेक्ट का उदाहरण आवंटित करने की आवश्यकता नहीं है। एक classविधि स्वयं निहित है और उस वर्ग के किसी भी वस्तु की स्थिति की निर्भरता के बिना काम कर सकती है। एclass विधि से अपेक्षा की जाती है कि वह अपने सभी कामों के लिए मेमोरी आवंटित करे और जब काम करे, तब तक उस वर्ग का कोई भी उदाहरण पिछली कॉल में आवंटित किसी भी मेमोरी को क्लास विधि से मुक्त नहीं कर सकेगा।

एक instanceविधि इसके ठीक विपरीत है। जब तक आप उस वर्ग का एक उदाहरण आवंटित नहीं करते, आप उसे कॉल नहीं कर सकते। यह एक सामान्य वर्ग की तरह है जिसमें एक कंस्ट्रक्टर है और एक विध्वंसक हो सकता है (जो सभी आवंटित मेमोरी को साफ करता है)।

सबसे अधिक संभावना में (जब तक आप एक पुन: प्रयोज्य पुस्तकालय नहीं लिख रहे हैं, आपको classचर की आवश्यकता नहीं होनी चाहिए ।


1
एक स्पष्ट मामला जहां आपको कक्षा के तरीकों की आवश्यकता होती है वह उदाहरणों का निर्माण है। आपको अभी तक किसी भी उदाहरण के बिना उदाहरणों को बनाने में सक्षम होना चाहिए, अन्यथा पहला उदाहरण कभी भी नहीं बनाया जा सकता है। इसीलिए + आवंटन एक वर्ग विधि है और होनी चाहिए।
gnasher729

4

उदाहरण विधियाँ कक्षाओं के उदाहरणों पर संचालित होती हैं (जैसे, "ऑब्जेक्ट")। कक्षा विधियाँ कक्षाओं से जुड़ी होती हैं (अधिकांश भाषाएं staticइन लोगों के लिए कीवर्ड का उपयोग करती हैं )।


3

उदाहरण के लिए एक गेम लें जिसमें बहुत सारी कारें हैं। जब एक कार को तत्काल किया जाता है, तो यह एक कॉल करता है

[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 करने से आपका कोड बेहतर हो जाएगा, तो इसे शॉट दें, और यह ध्यान रखें कि एक क्लास मेथड आपको केवल अन्य क्लास मेथड्स / वैरिएबल का उपयोग करने देगा।


3

कक्षा के तरीके

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

उदाहरण के तरीके

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


यह "आवंटित" कीवर्ड के साथ बनाया जा सकता है न केवल "नया"। इसके अलावा, Objective-C एक इंस्टेंस विधि को कॉल करने के लिए मौजूद इंस्टेंस की मांग नहीं करता है, आप एक अशक्त पॉइंटर को संदेश भेज सकते हैं।
एल्विस स्ट्रैजडिन्स

3

ऑब्जेक्टिव-सी में सभी विधियाँ "-" या "+" वर्ण से शुरू होती हैं। उदाहरण:

@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];

3

क्लास मेटल्स


एक वर्ग विधि आम तौर पर या तो कक्षा का एक नया उदाहरण बनाती है या कक्षा के कुछ वैश्विक गुणों को पुनः प्राप्त करती है। क्लास मेथड्स इंस्टेंस पर काम नहीं करते हैं या इंस्टेंस वैरिएबल की कोई एक्सेस नहीं है।


स्थापना विधि


एक आवृत्ति विधि वर्ग के किसी विशेष उदाहरण पर कार्य करती है। उदाहरण के लिए, आपके द्वारा कार्यान्वित एक्सेसर्स विधि सभी आवृत्ति विधियाँ हैं। आप किसी विशेष ऑब्जेक्ट के उदाहरण चर सेट करने या प्राप्त करने के लिए उनका उपयोग करते हैं।


आह्वान


एक इंस्टेंस विधि लागू करने के लिए, आप मैसेज को क्लास के एक इंस्टेंस पर भेजते हैं।

कक्षा पद्धति लागू करने के लिए, आप कक्षा को सीधे संदेश भेजते हैं।


स्रोत: IOS - ऑब्जेक्टिव-सी - क्लास मेथड्स एंड इंस्टेंस मेथड्स


1

कक्षा के तरीके किसी भी उदाहरण चर के मूल्य को बदल या जान नहीं सकते। यह जानने के लिए मानदंड होना चाहिए कि क्या कोई उदाहरण विधि एक वर्ग विधि हो सकती है।


-1 मुझ से, क्योंकि आप उदाहरण के लिए कक्षा विधि में उत्तीर्ण हो सकते हैं और यह परिवर्तनशील हो सकता है और यह जान सकता है कि यह चर का मान है।
एल्विस स्ट्राडिन्स

1

यह भी याद रखें, एक ही विचार चर पर लागू होता है। जब आप तरीकों / कार्यों के लिए वैरिएबल के बारे में बात कर रहे हैं, तो आप स्थिर, सदस्य, उदाहरण, वर्ग और इतने पर आ जाएंगे।

ऐसा लगता है कि ओब्ज-सी समुदाय में सामान्य शब्द आइवर चर के लिए है, लेकिन मैं अभी तक ओब्ज-सी लड़का नहीं हूं।


1

उपरोक्त उत्तरों के लिए एक अपडेट, मैं मानता हूं कि इंस्टेंस मेथड एक क्लास के इंस्टेंस का उपयोग करते हैं, जबकि एक क्लास मेथड को सिर्फ क्लास के नाम के साथ इस्तेमाल किया जा सकता है।

उद्देश्य-सी में स्वत: संदर्भ गणना के अस्तित्व में आने के बाद आवृत्ति विधि और वर्ग विधि के बीच कोई अंतर नहीं है।

उदाहरण के लिए [NS StringWithformat:..]एक वर्ग विधि और [[NSString alloc] initwihtformat:..]एक आवृत्ति विधि, दोनों एआरसी के बाद समान हैं


1

नोट: यह केवल छद्म कोड प्रारूप में है

कक्षा विधि

संकलन के समय लगभग सभी को इसकी आवश्यकता होती है । इसके लिए किसी उपयोगकर्ता इनपुट की आवश्यकता नहीं है, न ही इसकी गणना एक उदाहरण पर आधारित है। इसके बारे में सब कुछ वर्ग / ब्लूप्रिंट पर आधारित है - जो अद्वितीय है यानी आपके पास एक क्लास के लिए कई ब्लूप्रिंट नहीं हैं। क्या आपके पास संकलन समय के दौरान विभिन्न विविधताएं हो सकती हैं? नहीं, इसलिए कक्षा अद्वितीय है और इसलिए कोई बात नहीं है कि आप कितनी बार कक्षा पद्धति को कॉल करते हैं, यह इंगित करने वाला सूचक समान होगा।

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.

यदि आप अन्य भाषाओं से आ रहे हैं तो स्टैटिक विधियां कक्षा के तरीकों के समान हैं।
यदि आप स्विफ्ट से आ रहे हैं, तो टाइप तरीके क्लास के तरीकों के समान हैं।


0

उपरोक्त उत्तरों को जोड़ना

क्लास विधि कक्षा पर काम करेगी, हम इसे सामान्य उद्देश्य के लिए उपयोग करेंगे, जैसे + stringWithFormat, वर्ग का आकार और सबसे महत्वपूर्ण init आदि।

NSString *str = [NSString stringWithFormat:@"%.02f%%",someFloat]; 

इंस्टैंस मेथड एक क्लास के इंस्टेंस पर काम करेगा, न कि एक क्लास पर, जैसे हम दो व्यक्ति हैं और हम प्रत्येक के बैलेंस को अलग-अलग जानना चाहते हैं। क्योंकि यह सामान्य प्रतिक्रिया नहीं लौटाएगा। जैसे NSSArray आदि की गिनती निर्धारित करना।

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