उद्देश्य-सी वर्ग -> स्ट्रिंग की तरह: [NSArray className] -> @ "NSArray"


128

मैं क्लास ऑब्जेक्ट से ही एक वर्ग का एक स्ट्रिंग नाम प्राप्त करने की कोशिश कर रहा हूं।

// For instance
[NSArray className]; // @"NSArray"

मैंने पाया है, object_getClassName(id obj)लेकिन इसके लिए एक उदाहरण की आवश्यकता है, और मेरे मामले में यह अनावश्यक काम है।

तो मैं क्लास ऑब्जेक्ट से स्ट्रिंग कैसे प्राप्त कर सकता हूं, और उदाहरण नहीं ?

जवाबों:


305
NSString *name = NSStringFromClass ([NSArray class]);

आप अन्य तरीके से भी वापस जा सकते हैं:

Class arrayClass = NSClassFromString (name);
id anInstance = [[arrayClass alloc] init];

धन्यवाद! कैसे NSStringFromClassलागू किया जाता है? क्या वर्ग नाम को एक static NSStringचर में संग्रहीत करना अधिक प्रदर्शनकारी है ?
ma11hew28 18

13
@MattDiPasquale: सभी वर्ग के नाम ऑब्जेक्टिव-सी रनटाइम में कहीं भी संग्रहीत किए जाते हैं (रनटाइम के आंतरिक भाग अधिकतर एप्लिकेशन से छिपे होते हैं और केवल कुछ एपीआई फ़ंक्शन के माध्यम से उजागर होते हैं)। प्रत्येक वर्ग वस्तु (जैसे [NSArray class]) वास्तव में एक है structstructजैसा कि इसके नाम, विधियों यह औजार, सुपर क्लास, आदि सहित, वर्ग के बारे में जानकारी का एक बहुत कुछ शामिल है NSStringFromClassसिर्फ इस से क्लास का नाम खींचती है structएक करने के लिए और यह धर्मान्तरित NSString। वर्ग नाम को किसी में संग्रहीत न करें static NSString, यह किसी भी प्रदर्शन लाभ की पेशकश नहीं करेगा।
ड्रीमलैक्स

3
@MattDiPasquale: NSClassFromStringथोड़ा अलग तरीके से काम करता है। चूँकि सभी क्लास के नाम ऑब्जेक्टिव-सी रनटाइम में कहीं मौजूद हैं, NSClassFromStringइसलिए स्ट्रिंग लेता है और रनटाइम की देखरेख वाली कक्षाओं की सूची की खोज करता है, जिसमें दिए गए नाम हैं। अगर यह मिल जाता है, तो वह इसे वापस कर देता है, अन्यथा यह वापस आ जाता है Nil
ड्रीमलैक्स

2
@MattDiPasquale: "NSStringFromClass को कैसे लागू किया जाता है?" यदि आप वास्तव में जानना चाहते हैं, तो यह शायद class_getName()रनटाइम में उपयोग करता है, जो एक सी स्ट्रिंग लौटाता है
user102008

2
@AlexZavatone: classNameस्क्रिप्टिंग एक्सटेंशन द्वारा जोड़ा गया एक तरीका है, जो केवल मैक ओएस एक्स पर उपलब्ध है, फिर भी यह कैसे काम करता है, यह पूरी तरह से प्रलेखित नहीं है (या कम से कम यह पिछली बार जब मैंने जाँच नहीं की थी) NSStringFromClass()इसके बारे में जाने का सही तरीका है।
ड्रीमलैक्स

1

यहाँ थोड़ा कम टाइपिंग करने का एक अलग तरीका है:

NSString *name = [NSArray description];

7
जो करने का अनुरोध किया जाता है, उसकी गारंटी नहीं है। उस विधि को आम तौर पर ऑब्जेक्ट का विवरण और उसमें शामिल डेटा प्रदान करने के लिए ओवरराइड किया जाता है।
एलेक्स वेन

3
मुझे पता है कि यह एक INSTANCE विधि के रूप में ओवरराइड किया गया है, लेकिन कितनी बार + वर्णन CLASS METHOD ओवरराइड है? किसी भी घटना में यह विचार करने के लायक है कि क्या हर वर्ग के लिए नहीं है ... मुझे नहीं लगता कि डाउनग्रेड के लिए बुलाया गया था।
शेरविन ज़ैध

1
@SherwinZadeh: मुझे लगता है कि व्यवहार में, आपको उन कक्षाओं को खोजने की संभावना नहीं है +description, जो ओवरराइड हो गए हैं , हालांकि, सिद्धांत रूप में, यह उद्देश्य नहीं है +description, और इसलिए कक्षा के नाम निर्धारित करने के लिए यह विधि नाजुक है।
ड्रीमलैक्स

1

इस विकल्प पर विचार करें:

const char *name = class_getName(cls);

यह बहुत तेज़ है, क्योंकि इसमें NSString ऑब्जेक्ट को आवंटित करने और ASCII को जो भी NSStringप्रतिनिधित्व है उसे परिवर्तित करने की आवश्यकता नहीं है। इसी तरह NSStringFromClass()लागू किया जाता है।


यह मेरे लिए उपयोगी था, लेकिन फ़ाइल के शीर्ष पर #import <objc / runtime.h> जोड़ने की आवश्यकता थी।
स्पार्कलूमा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.