संक्षिप्त उत्तर: वह स्ट्रिंग NSCFString
है, जो NSMutableString
से प्राप्त एक वर्ग है, इसलिए यह सुपरक्लास सहित NSMutableString
में घोषित विधियों के लिए चयनकर्ताओं का जवाब देती है।
इतना छोटा जवाब नहीं: फाउंडेशन स्ट्रिंग कोर फाउंडेशन तारों के साथ टोल-फ्री हैं। डेवलपर्स इन स्ट्रिंग्स को संदर्भित करने के लिए अपारदर्शी प्रकार CFStringRef
(NSString
के साथ ब्रिज किए गए) और CFMutableStringRef
(NSMutableString
के साथ ब्रिज किया गया), पहली नज़र में, दो अलग-अलग प्रकार के तार होते हैं: अपरिवर्तनीय और परिवर्तनीय।
एक कोर फाउंडेशन आंतरिक कार्यान्वयन दृष्टिकोण से, वहाँ एक निजी प्रकार struct __CFString
कहा जाता है। यह निजी प्रकार एक छोटा सा क्षेत्र रखता है जो अन्य जानकारी के साथ स्टोर करता है, चाहे स्ट्रिंग उत्परिवर्तनीय या अपरिवर्तनीय हो।एक प्रकार का होना कार्यान्वयन को सरल बनाता है क्योंकि कई कार्यों को अपरिवर्तनीय और परिवर्तनीय तारों द्वारा साझा किया जाता है।
जब भी एक कोर फाउंडेशन फ़ंक्शन जो उत्परिवर्तनीय तारों पर चल रहा है उसे कॉल किया जाता है, तो यह पहले उस बिट फ़ील्ड को पढ़ता है और जांचता है कि स्ट्रिंग उत्परिवर्तनीय या अपरिवर्तनीय है या नहीं। यदि तर्क एक परिवर्तनीय स्ट्रिंग माना जाता है लेकिन वास्तव में यह नहीं है, तो फ़ंक्शन एक त्रुटि देता है (उदा। _CFStringErrNotMutable
) या कोई दावा विफल रहता है (उदा। __CFAssertIsStringAndMutable(cf)
)।
किसी भी दर पर, ये कार्यान्वयन विवरण हैं, और वे भविष्य में बदल सकते हैं। तथ्य यह है कि NSString
-appendString:
घोषित नहीं करता है इसका मतलब यह नहीं है कि प्रत्येक NSString
उदाहरण संबंधित चयनकर्ता का जवाब नहीं देता है - substitutability सोचें। एक ही स्थिति अन्य परिवर्तनीय/अपरिवर्तनीय कक्षाओं जैसे NSArray
और NSMutableArray
पर लागू होती है। डेवलपर परिप्रेक्ष्य से, महत्वपूर्ण बात यह है कि लौटाई गई वस्तु एक प्रकार का है जो रिटर्न प्रकार से मेल खाती है - यह प्रकार या स्वयं के उस प्रकार का उप प्रकार हो सकता है। कक्षा क्लस्टर इसे एक और अधिक गड़बड़ कर देते हैं लेकिन स्थिति प्रति वर्ग क्लस्टर तक ही सीमित नहीं है।
संक्षेप में, आप केवल उम्मीद कर सकते हैं कि एक विधि किसी ऑब्जेक्ट को लौटाती है जिसका प्रकार पदानुक्रम से संबंधित है (यानी, या तो स्वयं का प्रकार या उप प्रकार) वापसी मूल्य के प्रकार के प्रकार। दुर्भाग्यवश, इसका मतलब यह है कि आप यह जांच नहीं सकते कि कोई फाउंडेशन ऑब्जेक्ट म्यूटेबल है या नहीं। लेकिन फिर फिर, क्या आपको वाकई इस चेक की ज़रूरत है?
आप CFShowStr()
फ़ंक्शन का उपयोग एक स्ट्रिंग से जानकारी प्राप्त कर सकते हैं। अपने प्रश्न में उदाहरण में, जोड़ने
CFShowStr((CFStringRef)myString);
आप एक निर्गम के लिए इसी तरह मिलना चाहिए:
Length 0
IsEightBit 1
HasLengthByte 0
HasNullByte 1
InlineContents 0
Allocator SystemDefault
Mutable 0
Contents 0x0
जहां
Mutable 0
मतलब यह है कि स्ट्रिंग तथ्य अपरिवर्तनीय है।
यदि आपने इसे वास्तविक 'appendString भेजा है:' संदेश कुछ भी उड़ाता है? – BoltClock
हां: 'अपेंडस्ट्रिंग के साथ अपरिवर्तनीय ऑब्जेक्ट को म्यूट करने का प्रयास:'। – zoul
@ बोल्टक्लॉक: हां यह उड़ाता है, लेकिन यह नहीं है कि 'प्रतिक्रियाओं का चयन करने का बिंदु' चयनकर्ता, 'विधि, इसे जांचने के लिए इसे वास्तविक' appendString: 'संदेश भेजने से पहले उड़ा नहीं होगा? – user698769