उद्देश्य-सी रनटाइम: यह जांचने का सबसे अच्छा तरीका है कि क्या वर्ग प्रोटोकॉल के अनुरूप है?


171

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

मैं बस class_getSuperclass () का उपयोग कर सकता हूं और सुपरक्लास के शून्य होने तक पदानुक्रम में सभी कक्षाओं की पुनरावृत्ति कर सकता हूं। हालांकि मुझे आश्चर्य है कि अगर यह गहरी नेस्टेड श्रेणी पदानुक्रमों के लिए अक्षम हो सकता है, और शायद ऐसा करने का एक अच्छा तरीका है?

दूसरे शब्दों में, कैसे NSObject विधि के रूप में, ऑब्जेक्टिव-सी रनटाइम विधियों का उपयोग करके सबसे अच्छा लागू किया जाता है ताकि यह सुपरक्लास पर प्रोटोकॉल का पता लगा सके?

 [myObject conformsToProtocol:@protocol(MyProtocol)];

अगर मैं सही तरीके से क्लास पदानुक्रम के साथ ऊपर जा रहा हूँ तो मुझे बताएं।

जवाबों:


309

डॉक्स के अनुसार ,

[MyClass conformsToProtocol:@protocol(MyProtocol)];

कार्य करना चाहिए।


4
आप सही हे। देर हो चुकी थी और कोई कोड पूरा करने के सुझाव एक्सकोड द्वारा नहीं किए गए थे। मैंने कक्षा की परिभाषा की जाँच की और यह देखते हुए कि यह "typedef struct objc_class * Class" था, मैंने NSObject वर्ग के संदर्भ की जाँच नहीं की।
LearnCocos2D

क्या किसी वर्ग के बजाय उदाहरण पर ऐसा करने का कोई तरीका है? मेरे self.delegateकई प्रोटोकॉल लागू होते हैं और मैं यह देखना चाहता हूं कि क्या यह दूसरों की श्रेणी के अनुरूप है।
कोनराड पिसिक

@KonradPiascik बस के बजाय उदाहरण पर यह कहते हैं: [someObject conformsToProtocol:@protocol(MyProtocol)]
वीवाह

3

या, यदि यह एक सामान्य सूचक है, जैसे:

Class<MyProtocol> someClassPointer = nil;

आप उपयोग कर सकते हैं:

[someClassPointer.class conformsToProtocol:@protocol(MyProtocol)];
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.