जाँच करें कि क्या कोई विधि मौजूद है


111

अगर कोई तरीका ऑब्जेक्टिव-सी में मौजूद है तो क्या मैं इसका परीक्षण कर सकता हूं?

मैं यह देखने के लिए एक गार्ड जोड़ने की कोशिश कर रहा हूं कि क्या मेरे ऑब्जेक्ट को कॉल करने से पहले विधि है।


यह भी सवाल है कि क्या यह पहली जगह में सही दृष्टिकोण है, क्योंकि ऑब्जेक्टिव-सी कक्षाएं चयनकर्ताओं को जवाब दे सकती हैं कि उन्होंने (के माध्यम से - forwardInvocation:) घोषित नहीं किया है ।
डोनल फेलो

जवाबों:


189
if ([obj respondsToSelector:@selector(methodName:withEtc:)]) {
   [obj methodName:123 withEtc:456];
}

72

स्थिर संदेश इंस्टेंस भी है। RespondToSelector: (SEL) चयनकर्ता आप इसे इस तरह कहेंगे:

[MyClass instancesRespondToSelector:@selector(someMethod:withParams:)]

या इस तरह:

[[myObject class] instancesRespondToSelector:@selector(someMethod:withParams:)]

यह उपयोगी हो सकता है यदि आप एक निर्माता या किसी अन्य को इस पर निर्भर करना चाहते हैं (मेरा मतलब है, उदाहरण के पहले ही)।


1
क्या अलग-अलग उदाहरणों से।
CReaTuS

1
मुख्य अंतर यह है कि एक एक उदाहरण संदेश है (यदि निर्धारित उदाहरण संदेश मौजूद है, तो परीक्षण करने के लिए) जबकि दूसरा एक वर्ग संदेश है (यदि निर्धारित वर्ग संदेश मौजूद है तो परीक्षण करने के लिए)।
रिकर्ड पेरेज़ डेल कैंपो

1
+1 के लिए [MyClass instancesRespondToSelector]। मुझे एक init निर्माण विधि के अंदर इसकी आवश्यकता थी: जब उप-वर्गिंग दूसरों के बजाय एक सुपर इनिट विधि को कॉल करने के लिए आवश्यक है (हटाए गए लोग), क्योंकि स्वयं अभी तक नहीं बनाया गया है और प्रतिक्रिया करता हैसुविधा हमेशा NO नहीं लौटेगी।
लाइटमैन

12

का उपयोग करें respondsToSelector:। से प्रलेखन :

respondsToSelector:

एक बूलियन मान लौटाता है जो इंगित करता है कि क्या रिसीवर लागू करता है या एक विधि विरासत में मिलती है जो एक निर्दिष्ट संदेश का जवाब दे सकती है।

- (BOOL)respondsToSelector:(SEL)aSelector

पैरामीटर
aSelector - एक चयनकर्ता जो एक संदेश की पहचान करता है।

वापसी मान
YES यदि रिसीवर लागू करता है या एक विधि विरासत में मिलती है जो कि एसेलर का जवाब दे सकती है , अन्यथा NO


10

आप देख रहे हैं respondsToSelector: -

if ([foo respondsToSelector: @selector(bar)] {
  [foo bar];
}

जैसा कि डोनल कहते हैं कि ऊपर आपको बताता है कि फू चयनकर्ता को बार चयनकर्ता निश्चित रूप से संभाल सकता है । हालांकि, अगर फू एक छद्म है जो कुछ अंतर्निहित वस्तु को बार की तरफ बार करता है जो बार संदेश प्राप्त करेगा, तो उत्तर देता है :Selector: आपको NO बताएगा, भले ही संदेश उस वस्तु को अग्रेषित किया जाएगा जो बार का जवाब देती है।


1

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

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