शायद निम्न उदाहरण मार्क और नील्स के उत्तरों पर जोड़ देगा और चीजों को स्पष्ट करने में मदद करेगा।
अपरिवर्तनीय तार
// Setup two variables to point to the same string
NSString * str1 = @"Hello World";
NSString * str2 = str1;
// "Replace" the second string
str2 = @"Hello ikilimnik";
// And list their current values
NSLog(@"str1 = %@, str2 = %@", str1, str2);
परिवर्त्य तार
// Setup two variables to point to the same string
NSMutableString * str1 = [NSMutableString stringWithString:@"Hello World"];
NSMutableString * str2 = str1;
// "Replace" the second string
[str2 setString:@"Hello ikilimnik"];
// And list their current values
NSLog(@"str1 = %@, str2 = %@", str1, str2);
सूचना जब आप अपरिवर्तनीय NSString वर्ग एक ही रास्ता के लिए एक स्ट्रिंग "की जगह" एक नया स्ट्रिंग बनाने और अपनी चर का अद्यतन करने के लिए है कि का उपयोग इसे इंगित करने के लिए "str2"। हालांकि यह "str1" को इंगित नहीं कर रहा है, इसलिए यह मूल स्ट्रिंग का संदर्भ देगा।
एनएसएमयूटेबल स्ट्रिंग उदाहरण में, हम दूसरी स्ट्रिंग नहीं बनाते हैं, बल्कि मौजूदा "हैलो वर्ल्ड" स्ट्रिंग की सामग्री को बदलते हैं (mutate)। चूंकि दोनों चर एक ही स्ट्रिंग ऑब्जेक्ट को इंगित करते रहते हैं, इसलिए वे दोनों एनएसएलओजी को कॉल में नए मान की रिपोर्ट करेंगे।
पॉइंटर चर और वास्तविक ऑब्जेक्ट के बीच अंतर करना महत्वपूर्ण है। एक एनएसएसटींग ऑब्जेक्ट अपरिवर्तनीय है, लेकिन यह आपको एक चर के मान को बदलने से नहीं रोकता है जो स्ट्रिंग को इंगित करता है।
डेटा प्रकार "एनएसएसटींग *" एक एनएसएसटींग ऑब्जेक्ट के लिए एक सूचक है, ऑब्जेक्ट स्वयं नहीं। यदि आप XCode डीबगर के भीतर किसी भी NSLog कथन में ब्रेक पॉइंट सेट करते हैं, तो आप इसे स्पष्ट करने के लिए प्रत्येक चर के कच्चे मान को देखना चाहेंगे।
स्रोत
2009-11-26 21:17:11
+1 वास्तव में व्याख्या करने के लिए और सिर्फ जवाब देने के लिए नहीं ... –
क्रिस्टोफर धन्यवाद, लेकिन उदाहरण के बारे में इस बारे में क्या: एनएसएसटींग * str = @ "one"; str = [str stringByAppendingString: @ "two"]; क्या आप कह रहे हैं कि भले ही मैं एक ही चर का उपयोग कर रहा हूं, मैं दो अलग-अलग ऑब्जेक्ट्स बना रहा हूं? साथ ही इन एनएसएसटींग ऑब्जेक्ट्स के साथ क्या होता है जो हम स्पष्ट रूप से बनाते हैं, क्या वे autorelease द्वारा साफ हो जाते हैं? –
हां जो दो अपरिवर्तनीय स्ट्रिंग ऑब्जेक्ट्स बनाएगा। "एक" और "onetwo"। Mutable s के लाभों में से एक ट्रिंग्स वे अतिरिक्त अस्थायी स्ट्रिंग ऑब्जेक्ट्स से बचने में मदद कर सकते हैं यदि आप प्रदान किए गए उदाहरण जैसे स्टाइल ऑपरेशंस को बहुत अधिक स्ट्रिंग करते हैं। यह गति और स्मृति उपयोग दक्षता लाभ प्रदान कर सकते हैं। –