2012-07-20 9 views
14

मेरे द्वारा देखा गया एकमात्र अंतर यह है कि respondsToSelector का रिसीवर या तो कक्षा या एक उदाहरण हो सकता है, जबकि instancesRespondToSelector में केवल क्लास रिसीवर हो सकता है। और क्या उन्हें अलग बनाता है, यद्यपि? क्या एक या दूसरे के साथ कोई प्रदर्शन समस्या है?उदाहरणों के बीच अंतर क्या है RespondToSelector और Objective-C में चयनकर्ता का जवाब देता है?

+0

प्रतिसाद देता है चयनकर्ता का रिसीवर केवल एक उदाहरण वस्तु हो सकता है। उदाहरणRespondToSelector का रिसीवर केवल क्लास ऑब्जेक्ट हो सकता है। + या - विधि – Karthick

उत्तर

24

हुड के अंतर्गत, -[NSObject respondsToSelector:] करने की जरूरत है अगर आप [super respondsToSelector:_cmd]; की तरह कुछ करना चाहता हूँ इस तरह कार्यान्वित किया जाता है:

+ (BOOL)instancesRespondToSelector:(SEL)aSelector { 
    return class_respondsToSelector(self, aSelector); 
} 
:

- (BOOL)respondsToSelector:(SEL)aSelector { 
    return class_respondsToSelector([self class], aSelector); 
} 

और +[Class instancesRespondToSelector:] इस तरह लागू किया गया है

(मैंने कोरफॉउंडेशन पर Hopper का उपयोग यह पता लगाने के लिए किया था।)

तो, मूल रूप से कोई अंतर नहीं है। हालांकि, आप अपनी खुद की कक्षा में respondsToSelector: ओवरराइड कर सकते हैं ताकि प्रति वर्ष के आधार पर YES या NO लौटाया जा सके (NSProxy ऐसा करता है)। आप instancesRespondToSelector: के साथ ऐसा नहीं कर सकते हैं।

+2

छोटी टिप्पणी, 'उदाहरण रीस्पॉन्डटॉ चयनकर्ता: '** ** ** (** ** ** **, यदि आप संदेश अग्रेषण तंत्र लागू करते हैं) ओवरराइड हो सकते हैं। देखें [उद्देश्य-सी रनटाइम प्रोग्रामिंग गाइड, सेक्शन फॉरवर्डिंग एंड विरासत] (https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtForwarding.html) – Lexandr

+0

@rob_mayoff मुझे पूरी तरह से पता है आप यहां क्या कह रहे हैं, लेकिन केवल एक छोटा सा बिंदु: आपके पहले बयान में [NSObject प्रतिसाद देता है: चयनकर्ता:], लेकिन एनएसओब्जेक्ट स्वयं ही एक वर्ग का नाम है, इसलिए यह थोड़ा सा उलझन में है। आप NSObjectInstance सही मतलब था? – pnizzle

+0

'एनएसओब्जेक्ट प्रतिसाद' चयनकर्ता:] 'लिखना आम है,' एनएसओब्जेक्ट 'वर्ग द्वारा परिभाषित एक उदाहरण संदेश का जिक्र करते हुए (यानी, एक संदेश जिसे' एनएसओब्जेक्ट 'या उसके उप-वर्गों के किसी भी उदाहरण में भेजा जा सकता है)। हम 'NSObject' कक्षा द्वारा परिभाषित एक वर्ग संदेश को संदर्भित करने के लिए '+ [NSObject instancesRespondToSelector:] 'लिखते हैं। –

9

एक अंतर यह respondsToSelector आपको बता नहीं सकता एक उदाहरण अपनी सुपर क्लास से एक विधि को विरासत में अगर है, तो यह अभ्यस्त काम करते हैं, आप [[self superclass] instancesRespondToSelector:_cmd];

+0

एचएम के प्रकार में एक फर्क पड़ता है, ठीक है। लेकिन क्या उद्देश्य-सी के उत्तराधिकारी अर्थशास्त्र के कारण यह नहीं है, वास्तव में दो तरीकों के बीच कोई अंतर नहीं है? क्योंकि अगर मैं गलत नहीं हूं, तो आपके उदाहरण से, '[[आत्म सुपरक्लास] प्रतिक्रिया देता है चयनकर्ता: _cmd];' काम करेगा। –

+0

नहीं, क्योंकि क्लास पर कोई विधि नहीं है जिसे प्रतिसाद कहा जाता है: चयनकर्ता:। प्रत्युत्तरsSoSlector एनएसओब्जेक्ट प्रोटोकॉल का हिस्सा है, जो कक्षा – wattson12

+0

@ वाटसन 12 'एनएसओब्जेक्ट' के अनुरूप नहीं है और इसके उप-वर्ग वर्ग विधि '+ प्रतिक्रियाओं का चयन करते हैं: चयनकर्ता: '। –

4

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

instancesRespondToSelector:वर्ग विधि है और यह निर्धारित करता है कि किसी वर्ग के उदाहरण किसी चयनकर्ता को प्रतिसाद देते हैं या नहीं। यह उस वर्ग के उदाहरण वाले के बिना कक्षा और दिए गए एक उदाहरण विधि के परीक्षण की अनुमति देता है।

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