नाम से वस्तुनिष्ठ-ग वर्ग उदाहरण बनाएं?


95

क्या नाम से कक्षा का उदाहरण बनाना संभव है? कुछ इस तरह:

NSString* className = @"Car";
id* p = [Magic createClassByName:className];
[p turnOnEngine];

मुझे नहीं पता कि यह उद्देश्य-सी में संभव है, लेकिन ऐसा लगता है कि यह होगा,

जवाबों:



38

NSClassFromString()वर्ग के नाम को गलत तरीके से रखने या अन्यथा उपयोग न होने वाले वर्ग का उपयोग करने का जोखिम है। यदि आप वह त्रुटि करते हैं तो आपको रनटाइम तक पता नहीं चलेगा। इसके बजाय, यदि आप Classएक चर बनाने के लिए अंतर्निहित उद्देश्य-सी प्रकार का उपयोग करते हैं, तो संकलक यह सत्यापित करेगा कि वर्ग मौजूद है।

उदाहरण के लिए, अपने में .h:

@property Class NameOfClass;

और फिर अपने में .m:

id object = [[NameOfClass alloc] init];

यदि आपने वर्ग नाम गलत किया है या यदि यह मौजूद नहीं है, तो आपको संकलन समय पर एक त्रुटि मिलेगी। इसके अलावा मुझे लगता है कि यह क्लीनर कोड है।


तुम जाओ, दोस्त पूरी तरह से यकीन नहीं है कि यह सबसे अच्छा जवाब है, क्योंकि इसमें दो लाइनों की आवश्यकता होती है और यह कम गतिशील होती है, लेकिन सभी को एक जैसा बना देती है
क्रिस मैककॉल

मुझे लगता है कि आप कह सकते हैं कि यह कम गतिशील है क्योंकि मैंने एक स्ट्रिंग के बजाय एक प्रतीक का उपयोग किया है। हालांकि, यदि आप उस वर्ग को जानते हैं जो आप कोड लिखते समय चाहते हैं, तो यह संभव है कि प्रतीक का उपयोग करना बेहतर हो ताकि संभावित टाइपो से बचा जा सके।
शमौन वुडसाइड

@ एसबवुडसाइड: यह कैसे काम कर सकता है? मैंने इसकी कोशिश की और मुझे लिंकर से "वास्तुकला के लिए अपरिभाषित प्रतीक" मिला।
लार्स श्नाइडर

इसे [[[स्व वर्ग] आवंटन] init] में बदलें; आपको किसी और चीज की जरूरत नहीं है।
निक टर्नर

ओपी का उपयोग-मामला कानूनी से अधिक है - यह ऑब्जेक्ट पदानुक्रम को फ़ाइल / मेमोरी-ब्लॉक / प्लिस्ट / जो कुछ भी करने के लिए किसी भी क्रमांकन के लिए आधार है। कई बार आपको पहले से पता नहीं होता है कि आपको किन वर्गों के लिए तत्काल आवेदन करना होगा। मेरा उपयोग-मामला थकाऊ करने के लिए "gazillion" NSValueTransformer "रजिस्टर" करने की आवश्यकता है और नकल के बजाय [NSValueTransformer setValueTransformer: MyTransformerer आवंटित] init: @ "MyTransformerA"]; 40 बार - मैं सिर्फ ट्रांसफार्मर नामों के एक NSArray को स्कैन करता हूं - और उन्हें स्ट्रिंग से बना / पंजीकृत करता हूं।
मत्ती श्नोर

8

आप बिना ऑब्जेक्टिव-सी के साथ काम कर रहे हैं, तो NeXTstep( OS X, iOS, GNUstepआदि) प्रणाली या यदि आप बस लगता है कि इस विधि क्लीनर है, तो आप उपयोग कर सकता है ऑब्जेक्टिव-सी भाषा क्रम पुस्तकालय के एपीआई । के तहत Objective-C 2.0:

#import <objc/runtime.h>
//Declaration in the above named file
id objc_getClass(const char* name);
//Usage
id c = objc_getClass("Object");
[ [ c alloc ] free ];

उद्देश्य-सी (1.0 या अनाम संस्करण) के तहत आप निम्नलिखित का उपयोग करेंगे:

#import <objc/objc-api.h>
//Declaration within the above named file
Class objc_get_class( const char* name);
//Usage
Class cls = objc_get_class( "Test" );
id obj = class_create_instance( cls );
[ obj free ];

मैंने 1.0संस्करण का परीक्षण नहीं किया है , हालांकि मैंने 2.0फ़ंक्शन का उपयोग कोड में किया है जो अब उत्पादन में है। मैं व्यक्तिगत रूप से उपयोग करने में विश्वास करता हूं2.0 समारोह उपलब्ध क्लीनर अगर एन एस समारोह से है, क्योंकि यह कम स्थान लेता है: the length of the name in bytes + 1 ( null terminator )बनाम 2.0 एपीआई के लिए the sum of two pointers (isa, cstring), एक size_t length (cstring_length), और length of the string in bytes + 1के लिए NeXTSTEPएपीआई।


2
@interface Magic : NSObject
+ (id)createInstanceOfClass:(Class)classe;
@end

@implementation Magic

+ (id)createInstanceOfClass:(Class)classe
{
    return [[classe alloc] init];
}

@end

फिर इसका उपयोग करने के लिए:

Car *car = [Magic createInstanceOfClass:[Car class]];
[car engineTurnOn];
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.