2011-06-18 10 views
17

का उपयोग करके एक विशिष्ट प्रोटोकॉल के अनुरूप हैं। मैं कक्षाओं को "टैग" करने का एक तरीका समझने की कोशिश कर रहा हूं जो बाद में लिखा जाएगा, इसलिए मैं उन्हें रनटाइम पर पा सकता हूं, लेकिन बिना लागू किए एक विशिष्ट अभिभावक वर्गों का उपयोग। वर्तमान में मैं शायद प्रोटोकॉल लगाने और फिर उस प्रोटोकॉल वाले सभी वर्गों को ढूंढने पर विचार कर रहा हूं।उन वर्गों को ढूंढना जो घोषणा करते हैं कि वे उद्देश्य-सी रनटाइम

लेकिन मैं यह समझने में सक्षम नहीं हूं कि कैसे।

क्या किसी को पता है कि रनटाइम पर एक विशिष्ट प्रोटोकॉल को लागू करने वाले सभी वर्गों को ढूंढना संभव है? या वैकल्पिक रूप से - कक्षाओं को "टैग" करने और उन्हें खोजने का एक बेहतर तरीका है?

+0

अरोथ का जवाब काम करेगा, लेकिन मैं सुझाव दूंगा कि आप अपनी वास्तुकला पर फिर से जाएं और ऐसी चीज करने की आवश्यकता को खत्म कर दें। आम तौर पर, इस तरह के कमजोर युग्मित आर्किटेक्चर भविष्य में बहुत नाजुक कोड और महत्वपूर्ण रखरखाव/रिफैक्टरिंग सिरदर्द का कारण बनेंगे। मज़ा, निश्चित रूप से, लेकिन अंततः अव्यवहारिक। – bbum

+0

आम तौर पर मैं चाहता था, लेकिन जो मैं खेल रहा हूं वह वसंतफ्रेमवर्क अवधारणाओं के समान कुछ है। प्रभावी रूप से मैं कक्षाओं पर काम करने के लिए कोडिंग कर रहा हूं जो तब तक अस्तित्व में नहीं रहेंगे जब तक कि मेरे ढांचे को किसी अन्य प्रोजेक्ट में शामिल नहीं किया जाता है। मैं जो करने का प्रयास कर रहा हूं वह है कि डेवलपर को मेरी कक्षाओं को विस्तारित करने की आवश्यकता के बिना मैं जो कर रहा हूं उसका उपयोग करने की अनुमति देना जो उनके स्वयं के पदानुक्रम के मामले में समस्याग्रस्त साबित हो सकता है। इस प्रकार मैं कक्षाओं को "टैग" करने के तरीकों की तलाश में हूं ताकि मेरा ढांचा उनके साथ काम करना जानता हो। – drekka

+0

कूल। मैं सुझाव दूंगा कि आप कुछ अमूर्त आधार वर्ग प्रदान करते हैं और अन्य डेवलपर्स को उसमें से विरासत मिलती है, जो आवश्यकतानुसार कार्यक्षमता को ओवरराइड करते हैं। साथ ही, डेवलपर्स को प्रभावी ढंग से अपने ढांचे के साथ अपनी कक्षाओं को पंजीकृत करना भी उपयोगी है; जो उन्हें कॉन्फ़िगरेशन के आधार पर सशर्त रूप से कुछ कक्षाओं को पंजीकृत करने का मौका देता है, न कि दूसरों को। – bbum

उत्तर

0

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

27

ऐसा लगता है कि Objective-C Runtime API का उपयोग करके यह बहुत मुश्किल होना चाहिए।

Class* classes = NULL; 
int numClasses = objc_getClassList(NULL, 0); 
if (numClasses > 0) { 
    classes = malloc(sizeof(Class) * numClasses); 
    numClasses = objc_getClassList(classes, numClasses); 
    for (int index = 0; index < numClasses; index++) { 
     Class nextClass = classes[index]; 
     if (class_conformsToProtocol(nextClass, @protocol(MyTaggingProtocol))) { 
      //found a tagged class, add it to the result-set, etc. 
     } 
    } 
    free(classes); 
} 
+0

मैंने सोचा कि मुझे ऐसा करना पड़ सकता है। लेकिन उम्मीद थी कि वहां एक बेहतर तरीका था क्योंकि ऐसा लगता है कि हजारों वर्ग हैं। हालांकि मैं केवल एक बार ऐसा करने का इरादा रखता हूं इसलिए प्रदर्शन उतना महत्वपूर्ण नहीं है। धन्यवाद – drekka

+0

@ डेरेक - हां, मुझे पूरा यकीन है कि आपको सबकुछ फिर से शुरू करना होगा। अधिकांश प्रतिबिंबित भाषाएं इतनी दूर तक नहीं जाती हैं कि "मुझे सभी ज्ञात वर्गों को एक्स लागू करें" जो कि प्रश्नों को लागू करते हैं। लेकिन जब तक आप कोशिश नहीं कर रहे हैं कुछ वास्तव में विस्तृत करें कि इसे एक बार पुनरावृत्ति करने के लिए पर्याप्त होना चाहिए और परिणाम कैश करना चाहिए। – aroth

+2

एआरसी के तहत संदर्भ: http://stackoverflow.com/questions/8730697/using-objc-getclasslist-under-arc – TopChul

1

मुझे लगता है कि आप वर्गों (objc_getClassList()) की सूची पर पुनरावृति करना होगा और जाँच प्रत्येक प्रश्न में प्रोटोकॉल लागू करता है या नहीं: विशेष रूप से, ऐसा लगता है जैसे आप objc_getClassList और class_conformsToProtocol का उपयोग कुछ करने के लिए कर सकते हैं की तरह लग रहा (class_conformsToProtocol())।