2010-04-22 6 views
31

जावा में, मैं उदाहरण के लिए, एक वर्ग हो सकता है, Utility और मैं एक स्थिर विधि changeToCapitalLetter कहा जाता है, इसलिए मैं कुछ इस तरह कर सकते हैं:मैं उद्देश्य-सी में एक स्थिर विधि कैसे बना सकता हूं?

Utility.changeToCapitalLetter(myString); 

मैं उद्देश्य सी में समान बात कैसे कर सकते?

धन्यवाद एक बहुत

उत्तर

89

ऑब्जेक्टिव-सी में, आप, इस "वर्ग तरीकों" कहते हैं देखने के here:

@interface MyClass : NSObject 

+ (void)aClassMethod; 
- (void)anInstanceMethod; 

@end 

+ महत्वपूर्ण बात यह है; आप इस तरह से विधि कॉल: [MyClass aClassMethod];

+2

ठीक है, लेकिन याद रखें कि आप हमेशा सामान्य वैश्विक सी कार्यों भी घोषणा कर सकते हैं। –

15

विकिपीडिया से: स्टेटिक तरीकों न वर्ग का एक उदाहरण की आवश्यकता होती है और न ही वे परोक्ष डेटा का उपयोग कर सकते हैं (या इस, स्वयं, मैं, आदि) इस तरह की एक उदाहरण।

यह वर्णन करता है कि उद्देश्य-सी के वर्ग विधियां क्या नहीं हैं।

एक उद्देश्य-सी कक्षा विधि को एक उदाहरण की आवश्यकता होती है जो विधि आमंत्रण का लक्ष्य है। यही है, इसके लिए मेटाक्लास का एक उदाहरण आवश्यक है जो क्लास ऑब्जेक्ट का आह्वान करता है।

स्थैतिक तरीकों के विपरीत, उद्देश्य-सी के वर्ग विधियों को विरासत में प्राप्त किया जा सकता है (जो उपर्युक्त स्वयं के साथ संयोजन में है, यही कारण है कि कई कक्षाएं एनएसओब्जेक्ट पर एक आवंटित, सरल, कार्यान्वयन को अपने स्वयं के कस्टम की आवश्यकता के बिना साझा कर सकती हैं कार्यान्वयन) और एक वर्ग विधि का आह्वान करना ठीक उसी objc_msgSend * आधारित प्रेषण तंत्र के माध्यम से किसी भी अन्य विधि कॉल साइट के माध्यम से चला जाता है।

उद्देश्य-सी के वर्ग विधियों को कक्षा पदानुक्रम में ओवरराइड किया जा सकता है और उन्हें घुमाया जा सकता है। इनमें से कोई भी भाषा में समर्थित नहीं है जो आमतौर पर कक्षा विधियों के बदले स्थिर तरीकों की पेशकश करता है।

हालांकि कक्षा के तरीके और स्थैतिक विधि अभ्यास में समान हैं, वे अलग-अलग हैं। स्थिर तरीकों के साथ कक्षा नामस्थान योग्यता के रूप में कार्य कर रही है। वर्ग तरीकों के साथ कक्षा में ही एक वस्तु है और इसलिए वर्ग तरीकों एक परिणाम के रूप आप कर सकते हैं निम्नलिखित

@interface TestClass : NSObject 

    +(void)classOrInstanceMethod; 
    -(void)classOrInstanceMethod; 

    @end 

    @implementation TestClass 

    +(void)classOrInstanceMethod{ 
     NSLog(@"%s", __PRETTY_FUNCTION__); 
    } 
    -(void)classOrInstanceMethod{ 
     NSLog(@"%s", __PRETTY_FUNCTION__); 
    } 
    @end 

    int main(int argc, const char* argv[]) 
    { 
     @autoreleasepool{ 
      NSLog(@"Static method in ObjectiveC"); 
     } 

     NSArray* arr = [NSArray arrayWithObjects:[[TestClass alloc]init], 
              [TestClass class], nil]; 
     for(id obj in arr) 
      [obj classOrInstanceMethod]; 
    } 

जो classOrInstanceMethod के संस्करण कहा जाता है, वर्ग वस्तु बिल्कुल वही बात उदाहरण तरीकों एक उदाहरण के लिए कर रहे हैं करने के लिए इस पर निर्भर करता है कि क्या ओबीजे एक वर्ग वस्तु है या उदाहरण है। यदि आप फैक्ट्री क्लास पैटर्न से परिचित हैं, तो यह पैटर्न उद्देश्य-सी भाषा का हिस्सा है।

नीचे की रेखा यह है कि स्थैतिक विधियां और कक्षा के तरीके बहुत अलग हैं। हालांकि यह अंतर दिन-प्रतिदिन कोडिंग उद्देश्यों के लिए अधिक पारदर्शी है, फिर भी ऐसी स्थितियां हैं जहां यह जानने के लिए कि क्लास विधियों का काम कैसे आपको कोड की अनावश्यक रेखाओं का एक टन बचा सकता है।

Orignal लिंक here और here

+1

यह ध्यान रखना उचित है कि यह एक मूल उत्तर नहीं है; [यह यहां लिखा गया था।] (https://stackoverflow.com/a/8089623/6645482) –

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