2012-12-10 11 views
5

के लिए NSClassFromString का उपयोग कैसे किया जा सकता है यह समझ में नहीं आता है कि मेरे पास परियोजना के दौरान एक परियोजना वर्ग है जो विकास चरण के दौरान है लेकिन ऐप स्टोर निर्माण के लिए संकलित किया जाएगा।सशर्त कॉलिंग

मैंने कई किताबें है कि NSClassFromString निर्धारित करने के लिए एक वर्ग के रूप में उदाहरण कोड के साथ मौजूद है इस्तेमाल किया जा सकता में पढ़ा है:

if (NSClassFromString(@"SomeClass") != nil) 
{ 
[SomeClass someMethod]; 
} 
else 
{ 
code not using SomeClass 
} 

हालांकि अपने प्रोजेक्ट में व्यवहार में इस डालने के बाद, मुझे लगता है कि मैं ' मैं लक्ष्य के लिए एक लिंकिंग त्रुटि प्राप्त कर रहा हूं जहां मैंने कुछ क्लास युक्त स्रोत फ़ाइल को हटा दिया है।

इसलिए मेरी निष्कर्ष एक वर्ग की उपस्थिति/अनुपस्थिति निर्धारित करने के लिए इस तंत्र है ही उपयोगी होती है, उस वर्ग जहां अन्य वर्गों एक विस्तार है जो किताबें है कि यह उल्लेख से लापता है प्रयोग कर रहे हैं (एक पुस्तकालय या स्रोत फ़ाइल के भीतर है तकनीक)। या क्या मुझे कुछ याद आ रहा है?

उत्तर

6

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

संकलक के लिए [SomeClass someMethod] जैसे पिछले स्थिर संदर्भ प्राप्त करने के लिए सफलतापूर्वक इसके लिए लिंक करने की आवश्यकता है।

आप सही हैं कि जब आप फाउंडेशन और ऐप्पल जैसे किसी चीज़ से लिंक करते हैं तो यह तंत्र काम करता है जैसे कि NSJSONSerialization मौजूद है या नहीं।

यह भी काम करता है यदि आप ऐसे ढांचे के खिलाफ कमजोर लिंक करते हैं जो मौजूद हो या न हो। तो उदा। आप ट्विटर.फ्रेमवर्क के खिलाफ कमजोर लिंक कर सकते हैं और [TWRequest alloc] ... का उपयोग कर सकते हैं। आप अभी भी आईओएस 4 पर निर्माण और तैनाती करने में सक्षम होंगे जहां बिल्कुल एक ट्विटर ढांचा नहीं था।

ऐप्पल वास्तव में पुस्तकालयों को संग्रहीत करने के तरीके में थोड़ा बदलाव कर चुका है और if([TWRequest class]) या स्पष्ट NSClassFromString के स्थान पर उपयोग करने के लिए जो भी आप कमजोर लिंक के स्थान पर उपयोग करने के लिए संक्रमण कर रहे हैं।

हालांकि आपके मामले में ऐसा लगता है कि आप या तो एक स्थिर पुस्तकालय से लिंक करना चाहते हैं या उससे लिंक नहीं करना चाहते हैं? तो कक्षा रनटाइम पर उपलब्ध हो सकती है या नहीं भी हो सकती है लेकिन लिंकर को भी दिखाई दे सकती है या नहीं भी हो सकती है?

उस स्थिति में आपको मेटाक्लास के शाब्दिक संदर्भों से बचने की आवश्यकता है। तो अगर आप की तरह कुछ कर सकता है:

Class someClassMetaClass = NSClassFromString(@"SomeClass"); 

if(someClassMetaClass) 
{ 
    SomeClass *instance = [[someClassMetaClass alloc] init]; 
    /* ... */ 
} 

जब तक हेडर फाइल दिखाई दे रहा है संकलक आप (क्योंकि कि द्विआधारी में वैसे भी जाना नहीं है) संकेत के लिए SomeClass प्रकार निर्दिष्ट करने की अनुमति खुश हो जाएगा और होगा प्रकाशित इंटरफेस के खिलाफ सामान्य स्वत: पूर्णता और चेतावनियों का सुझाव देने में सक्षम हो। बस सुनिश्चित करें कि आप हमेशा Class पर पॉइंटर के माध्यम से मेटाक्लास को संबोधित करते हैं जो आपको सीधे रनटाइम से मिलता है। इस तरह लिंकर को आगे बढ़ने की जरूरत नहीं है।

+0

धन्यवाद। मैं एक पुस्तकालय का निर्माण कर रहा हूं जिसमें लाइट संस्करण से गायब कुछ कक्षाओं के साथ "पूर्ण" और "लाइट" वेरिएंट हैं। कुछ अन्य वर्गों के व्यवहार पर निर्भर करते हैं कि वे मौजूद हैं या नहीं। – Gruntcakes

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