2011-04-09 10 views
74

उद्देश्य-सी में एक विधि, एक चयनकर्ता और एक संदेश के बीच क्या अंतर है?विधि और चयनकर्ता के बीच क्या अंतर है?

+5

संबंधित: [कॉलिंग विधि या संदेश भेजना?] (Http://stackoverflow.com/questions/2852381/calling-a-method-or-sending-a-message-in-objective-c) [विधि फोन या performSelector] (http://stackoverflow.com/questions/2674827/using-self-method-or-selectormethod) समान: हस्ताक्षर और चयनकर्ता] (बीच [अंतर http://stackoverflow.com/questions/3095015/whats -इस-अंतर-बीच-विधि-हस्ताक्षर व-चयनकर्ता-इन-उद्देश्य) –

उत्तर

129

यह एक बड़ा सवाल है।

  • चयनकर्ता - एक चयनकर्ता एक विधि के नाम है। आप इन चयनकर्ताओं के साथ बहुत परिचित हैं: alloc, init, release, dictionaryWithObjectsAndKeys:, setObject:forKey:, आदि ध्यान दें कि पेट के चयनकर्ता का हिस्सा है; इस तरह हम पहचानते हैं कि इस विधि को पैरामीटर की आवश्यकता है। इसके अलावा (हालांकि यह बेहद दुर्लभ है), आप इस तरह के चयनकर्ता हो सकते हैं: doFoo:::। यह एक तरीका है जो तीन मानकों को लेता है, और आप इसे [someObject doFoo:arg1 :arg2 :arg3] जैसे आह्वान करेंगे। चयनकर्ता घटकों के प्रत्येक भाग से पहले पत्र होने की कोई आवश्यकता नहीं है। जैसा कि मैंने कहा, यह बेहद दुर्लभ है, और आपको कोको ढांचे में उपयोग नहीं किया जाएगा। आप कोको में सीधे चयनकर्ताओं के साथ काम कर सकते हैं। वे प्रकार SEL है: SEL aSelector = @selector(doSomething:) या SEL aSelector = NSSelectorFromString(@"doSomething:");

  • संदेश - संदेश एक चयनकर्ता और तर्क आप इसके साथ भेज रहे है। अगर मैं [dictionary setObject:obj forKey:key] कहते हैं, तो "संदेश" चयनकर्ता setObject:forKey: प्लस तर्क obj और key है। बाद में आमंत्रण के लिए संदेशों को NSInvocation ऑब्जेक्ट में encapsulated किया जा सकता है। संदेश रिसीवर पर भेजे जाते हैं। (यानी, वह ऑब्जेक्ट जो संदेश प्राप्त करता है)।

  • विधि - एक विधि एक चयनकर्ता और एक कार्यान्वयन (और साथ मेटाडाटा) का एक संयोजन है।"कार्यान्वयन" कोड का वास्तविक ब्लॉक है; यह एक फ़ंक्शन पॉइंटर है (एक IMP)। Method संरचना (रनटाइम से पुनर्प्राप्त करने योग्य) का उपयोग करके आंतरिक रूप से एक वास्तविक विधि को पुनर्प्राप्त किया जा सकता है।


कुछ अन्य संबंधित चीजें हैं जो आप के लिए नहीं पूछा:

  • विधि हस्ताक्षर - एक विधि हस्ताक्षर डेटा प्रकार से लौट आए और एक विधि द्वारा स्वीकार प्रतिनिधित्व करता है। उन्हें रनटाइम पर NSMethodSignature और (कुछ मामलों में) कच्चे char* के माध्यम से प्रदर्शित किया जा सकता है।

  • कार्यान्वयन - विधि का वास्तविक निष्पादन योग्य कोड। रनटाइम पर इसका प्रकार IMP है, और यह वास्तव में केवल एक फ़ंक्शन पॉइंटर है। आईओएस 4.3 में ब्लॉक को IMP में बदलने की नई क्षमता शामिल है। यह है वास्तव में अच्छा है।

मजेदार बातें महसूस करने के लिए की है कि एक विधि (चयनकर्ता) की नाम विधि (IMP) की कार्यान्वयन से अलग है है। इसका मतलब यह है कि यदि आप साहसी महसूस कर रहे हैं, तो आप उन्हें चारों ओर स्वैप कर सकते हैं। आप रनटाइम पर विधियों को भी जोड़ और निकाल सकते हैं, क्योंकि आप जो भी कर रहे हैं वह हैश तालिका में एक प्रविष्टि संपादित कर रहा है: कुंजी चयनकर्ता है, और मान विधि के IMP है। यह आपको कुछ वास्तव में पागल और trippy सामान करने की अनुमति देता है। यह दिल की बेहोशी के लिए नहीं है। :)

7

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

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

1

इस साइट में सवाल में सभी शब्दावली का एक अच्छा सिंहावलोकन है: लिंक http://www.otierney.net/objective-c.html

चेक बाहर है, लेकिन मैं एक त्वरित सारांश प्रदान करेंगे:

एक विधि समारोह की एक विधि अनिवार्य रूप से पसंद की जाती है कि आप अपनी पसंदीदा प्रोग्रामिंग भाषा में उपयोग किया जाता है।

एक संदेश (लेख से) "एक संदेश को किसी अन्य ऑब्जेक्ट को गतिशील रूप से अग्रेषित किया जा सकता है। उद्देश्य-सी में किसी ऑब्जेक्ट पर एक संदेश को कॉल करने का अर्थ यह नहीं है कि ऑब्जेक्ट उस संदेश को लागू करता है, बस यह जानता है कि इसका जवाब कैसे दिया जाए किसी भी तरह से इसे सीधे लागू करने या किसी ऑब्जेक्ट को संदेश अग्रेषित करने के माध्यम से जो जानता है कि कैसे करें। "

चयनकर्ता दो बातें हो सकता है। यह किसी विधि के नाम का संदर्भ ले सकता है, या "अद्वितीय पहचानकर्ता को संदर्भित करता है जो स्रोत कोड संकलित होने पर नाम को प्रतिस्थापित करता है। संकलित चयनकर्ता प्रकार एसईएल हैं।" (से: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocSelectors.html)

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