जवाबों:
id object = [[NSClassFromString(@"NameofClass") alloc] init];
NSClassFromString()
वर्ग के नाम को गलत तरीके से रखने या अन्यथा उपयोग न होने वाले वर्ग का उपयोग करने का जोखिम है। यदि आप वह त्रुटि करते हैं तो आपको रनटाइम तक पता नहीं चलेगा। इसके बजाय, यदि आप Class
एक चर बनाने के लिए अंतर्निहित उद्देश्य-सी प्रकार का उपयोग करते हैं, तो संकलक यह सत्यापित करेगा कि वर्ग मौजूद है।
उदाहरण के लिए, अपने में .h
:
@property Class NameOfClass;
और फिर अपने में .m
:
id object = [[NameOfClass alloc] init];
यदि आपने वर्ग नाम गलत किया है या यदि यह मौजूद नहीं है, तो आपको संकलन समय पर एक त्रुटि मिलेगी। इसके अलावा मुझे लगता है कि यह क्लीनर कोड है।
आप बिना ऑब्जेक्टिव-सी के साथ काम कर रहे हैं, तो 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
एपीआई।