2010-11-15 18 views
7

क्या रन-टाइम पर उद्देश्य-सी में स्ट्रिंग से कक्षा को आयात करने का कोई तरीका है? कोई भी तरीका जो समान परिणाम उत्पन्न करेगा, का भी स्वागत होगा।उद्देश्य-सी में गतिशील रूप से लोड कक्षाएं?

संपादित करें:

मैं एक वर्ग जिसका नाम मैं कार्यावधि में निर्धारित करने के लिए पहुँच चाहते हैं। तो कुछ इस तरह:

NSString *className = getClassName(); 
Class myClass = loadClass(className); 
myClass *myVar = [[myClass alloc] init]; 

वहाँ फ़ाइल के शीर्ष पर myClass के लिए एक स्थिर #import निर्देश डाले बिना यह करने के लिए कोई तरीका है?

उत्तर

5

#import निर्देश नहीं "आयात" एक वर्ग - यह वर्तमान फ़ाइल में नाम की फ़ाइल से पाठ सम्मिलित करता है। यह स्रोत संकलित होने के बाद रनटाइम पर स्पष्ट रूप से उपयोगी नहीं है।

कक्षाओं और dynamically load the bundle के साथ एक बंडल बनाना चाहते हैं। कोर प्रोग्राम से कक्षाओं से बात करने में सक्षम होने के लिए, शायद आप कुछ आम प्रोटोकॉल चाहते हैं जो कक्षाओं को लागू करने के लिए बंडल करें।

+5

बेशक, आप आईफोन के लिए बंडल को गतिशील रूप से लोड नहीं कर सकते हैं। –

+0

@ जेसन कोको: क्या आप नहीं कर सकते? एनएसबंडल को आईओएस पर काम करने के रूप में दस्तावेज किया गया है। जब तक आप बाहरी कोड डाउनलोड नहीं कर रहे हैं, मुझे लगता है कि आप ठीक होंगे। – Chuck

+0

ऐसा लगता है कि "लोड करने योग्य बंडल" मैं चाहता हूं, और ऐप्पल प्रलेखन के अनुसार "लोड करने योग्य बंडलों का निर्माण और उपयोग आईओएस में समर्थित नहीं है।" मुझे लगता है कि ऐप्पल नहीं चाहता कि लोग आईओएस पर ठंडा गतिशील ढांचे को बनाना चाहते हैं जैसे कि मैं करना चाहता हूं, या फिर भी इसका समर्थन नहीं करता हूं। –

25

आप NSClassFromString विधि का उपयोग कर सकते हैं। तो:

// Creates an instance of an NSObject and stores it in anObject 
id anObject = [[NSClassFromString(@"NSObject") alloc] init]; 

कुछ अपने संपादित के जवाब में अधिक नमूना कोड:

NSString* myClassString = getClassName(); 
// if the class doesn't exist, myClass will be Nil and myVar will be nil 
Class* myClass = NSClassFromString(myClassString); 
id myVar = [[myClass alloc] init]; 
+0

दुर्भाग्यवश, ऐसा लगता है कि यह शून्य का एक उदाहरण बनाता है, जब मैं myClass का एक उदाहरण बनाना चाहता हूं। शायद यह उद्देश्य-सी में संभव नहीं है? पायथन में मैं एप्लिकेशन तर्क के आधार पर रन-टाइम पर गतिशील रूप से मॉड्यूल लोड कर सकता हूं। मैं उम्मीद कर रहा था कि उद्देश्य सी –

+0

@ जैकोब लाइल्स में ऐसा करने का एक तरीका था: यदि कोई ऐसी कक्षा नहीं मिली तो 'NSClassFromString()' शून्य वापस आती है। ऐसा लगता है जैसे आपकी कक्षा ऐप में लोड नहीं होती है। उस स्थिति में, आप मेरा जवाब देखना चाहेंगे। – Chuck

0

चक को सही रास्ते पर इंगित करने के लिए धन्यवाद, लेकिन इस क्वेरी के लिए सही उत्तर यह लगता है कि आईओएस 4.1 पर यह असंभव है, हालांकि लोड करने योग्य बंडलों का उपयोग कर मौजूदा मैक ओएसएक्स एसडीके के साथ यह संभव है।

+0

आपने उल्लेख किया था कि आप आईओएस 4.1 के बारे में पूछ रहे थे –

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