2010-12-08 13 views
5
NSDictionary *dict = [NSDictionary dictionary]; 
NSLog(@"%@", NSStringFromClass([dict class])); 

यह कोड "__NSDictionary0" प्रिंट करता है।NSDictionary असामान्य वर्ग का नाम क्यों रिपोर्ट करता है?

मेरे अपने वर्गों के लिए यह वास्तविक वर्ग नाम प्रिंट करता है।

NSDictionary को __NSDictionary0 के रूप में क्यों पहचाना जाता है, और क्या इस पर निर्भर होना सुरक्षित है?

उत्तर

15

NSDictionary एक क्लास क्लस्टर है। यहाँ उनके बारे में पढ़ें:

Cocoa Fundamentals Guide

"वास्तविक" वर्ग ही निजी है के रूप में, नहीं, यह सुरक्षित नहीं इस पर निर्भर है।

आप अगर अपनी कक्षा वास्तव में एक NSDictionary है या नहीं पता करने के लिए की जरूरत है, का उपयोग [dict isKindOfClass:[NSDictionary class]];

+4

अच्छा जवाब। और यदि अगला प्रश्न है "मैं यह निर्धारित करने की कोशिश कर रहा हूं कि कोई शब्दकोश परिवर्तनीय है या नहीं", तो ... नहीं ... आप इसे भी नहीं कर सकते हैं। – bbum

+3

क्या आप इसके लिए 'isMemberOfClass: [NSMutableDictionary class]' का उपयोग नहीं कर सकते? – GendoIkari

+0

हाँ, isMemberOfClass: यह निर्धारित करने के लिए उपयोग किया जा सकता है कि कोई शब्दकोश परिवर्तनीय है या नहीं। – JustSid

20

NSDictionary, एक वर्ग समूह है के रूप में Gendolkari कहा और Class Clusters are documented

और, नहीं, आप निजी उप-वर्ग की सटीक पहचान पर निर्भर नहीं हो सकते हैं।

आप निश्चित रूप से अगर यह एक शब्दकोश है या नहीं यह निर्धारित करने के लिए निम्न कार्य करने के लिए सक्षम होना चाहिए:,

[myThingaMaHoover isKindOfClass: [NSDictionary class]]; 

या, कम से कम है कि यह एक शब्दकोश के रूप में NSDictinoary वर्ग के एक हिस्से के रूप में लागू किया है क्लस्टर।

क्या आप नहीं कर सकते हैं isKindOfClass: या isMemberOfClass: का उपयोग यह निर्धारित करने के लिए है कि कोई शब्दकोश (या स्ट्रिंग, सरणी या सेट) उत्परिवर्तनीय है या नहीं। पर विचार करें:

NSDictionary *d = [NSDictionary dictionaryWithObject: [[NSObject new] autorelease] forKey: @"Bob"]; 
NSMutableDictionary *m = [NSMutableDictionary dictionaryWithObject: [[NSObject new] autorelease] forKey: @"Bob"]; 
NSLog(@"d class: %@ %@ %@", [d class], [d superclass], [[d superclass] superclass]); 
NSLog(@"m class: %@ %@ %@", [m class], [m superclass], [[m superclass] superclass]); 

यह आउटपुट:

d class: NSCFDictionary NSMutableDictionary NSDictionary 
m class: NSCFDictionary NSMutableDictionary NSDictionary 

d और m जो NSMutableDictionary (जो NSDictionary से विरासत) से विरासत NSCFDictionary के दोनों उदाहरण हैं।

+0

+1। – GendoIkari

1

तो, मूल रूप से, आपको यह जानने की जरूरत है कि क्या आपके पास पहले से एनएसएमयूटेबल डिक्शनरी या नंगे NSDictionary है या नहीं। या जानने की जरूरत नहीं है। या अपनी ऑब्जेक्ट से एनएसएमयूटेबल डिक्शनरी बनाएं (NSDictionary या NSMutableDictionary)?

मूल रूप से सवाल क्या था?

0

आप अस्थिरता के लिए परीक्षण करना चाहते हैं, अपने सबसे अच्छे शर्त शायद conformsToProtocol होगा: @protocol (NSMutableCopying)

+1

NSDictionary और NSArray एनएसएमयूटेबल कॉपीिंग की पुष्टि करता है। – Karmeye

0

एक NSDictionary अस्थिरता परीक्षण के लिए, आप could't सिर्फ एक एक विधि के लिए 'respondsToSelector' है कि केवल एक एनएसएमयूटेबल डिक्शनरी, जैसे addObject: ForKey :?

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