2009-05-25 16 views
8

मैंने कई पुस्तकों में पढ़ा है ... और ऑनलाइन ... अपरिवर्तनीय और परिवर्तनीय तारों के बारे में। वे दावा करते हैं कि "अपरिवर्तनीय तार" को बदला नहीं जा सकता है। (लेकिन वे कभी भी "परिवर्तन" को परिभाषित नहीं करते हैं।)एनएसएसटींग्स ​​पर अंतिम शब्द: उत्परिवर्तनीय और अपरिवर्तनीय

एनएसएमयूटेबलस्ट्रिंग का उपयोग किए बिना इनमें से कौन सा एनएसएसआरटींग बदला जा सकता है?

स्ट्रिंग में "कैटफ़िश" है ... और बाद में मैं इसे "बिल्ली" में बदलने की कोशिश करता हूं। (वही अक्षर, बस छोटा।)

इसमें "बिल्ली" है ... और मैं इसे "कैटफ़िश" में बदलने की कोशिश करता हूं। (इसी तरह की शुरुआत ... लेकिन अभी अधिक लंबा बना दिया गया है।)

मैं "बिल्ली" को "सीएटी" में बदलता हूं। (वही अक्षर, लेकिन सिर्फ मामला बदल गया है।)

मैं "बिल्ली" को "कुत्ते" में बदलता हूं। (पूरी तरह से अलग स्ट्रिंग, लेकिन एक ही लंबाई।)

मैं "बिल्ली" को "dogwood" में बदलता हूं। (पूरी तरह से अलग स्ट्रिंग, लेकिन अधिक।)

+0

लगभग एक क्लिनटोनियन प्रश्न! –

उत्तर

20

उत्तर है - कोई नहीं। अपरिवर्तनीय साधनों को मूल स्ट्रिंग से अलग में बदला नहीं जा सकता है। प्रत्येक चरित्र वही रहता है, लंबाई बदल नहीं सकती है, आदि। एक बार यह परिभाषित हो जाने पर आप उस स्ट्रिंग के बारे में कुछ भी नहीं बदल सकते हैं। यदि आप इसे लंबा या छोटा बनाना चाहते हैं या किसी भी वर्ण को बदलना चाहते हैं, तो आपको एक नई स्ट्रिंग बनाने की आवश्यकता है (या शुरू करने के लिए एनएसएमयूटेबल स्ट्रिंग का उपयोग करें)।

+0

त्वरित उत्तर के लिए धन्यवाद। क्या यह एनएसएसटींग को बेकार नहीं बनाता है? मैंने एक * VARIABLE * को एक एनएसएसटींग मान पर सेट किया है ... और फिर मैं इसे कभी नहीं बदल सकता। क्या यह आमतौर पर अन्य भाषाओं में "निरंतर" नहीं कहा जाता है? मैं (बजाय) शायद 99% समय के साथ अपने डंक के साथ "कुछ करना" चाहता हूं। तो क्या मुझे लगभग हर जगह MSMutableString का उपयोग नहीं करना चाहिए? (लेकिन मुझे शायद ही कभी इसका इस्तेमाल किया जाता है, जो कि आमतौर पर इस्तेमाल किए जाने वाले एनएसएसटींग की तुलना में किया जाता है।) – Donna

+0

कल्पना करें कि क्या int/float/long भी अपरिवर्तनीय थे। int x = 5; और फिर एक्स * कभी नहीं बदला जा सकता है। अपरिवर्तनीय (लगभग) बेकार है। नहीं? – Donna

+0

"कुछ कर रहा है" बस कुछ डेटा स्टोर से उन्हें पढ़ने और उन्हें प्रदर्शित करने का संकेत दे सकता है। इस मामले में आप उन्हें संशोधित नहीं करना चाहेंगे। – rein

2

आप "परिवर्तन" को परिभाषित करने के लिए बहुत जरूरत है, :)

मूल रूप से, जब आप एक NSString बनाते हैं, आप वर्णों की एक सरणी बना रहे हैं और आप संकलक कि की सामग्री कह रहे हैं ने कहा कि सरणी कभी नहीं बदलेगा "कभी नहीं बदला" हिस्सा "अपरिवर्तनीय" भाग है; स्ट्रिंग वाले डेटा को कभी भी संशोधित नहीं किया जा सकता है।

दूसरी ओर, एक एनएसएमयूटेबलस्ट्रिंग आपको वास्तव में उस डेटा को बदलने की अनुमति देता है जो इसे इंगित करता है (इसलिए यह 'mutable' है)। NSPutableString के लिए मौजूद 'appendString' विधि पर ध्यान दें; यह वास्तव में डेटा लेता है और स्ट्रिंग के अंत में इसे थप्पड़ मारता है।

उदाहरण के लिए, आप के लिए किया था, तो

:

NSString * myString = @ "कैट"; myString = @ "गोल्डफिश";

यह ठीक काम करेगा। आप वास्तव में डेटा MyString डेटा को कभी नहीं बदल रहे हैं; आप बस यह कह रहे हैं कि आप इसे अपरिवर्तनीय डेटा के नए खंड को इंगित करना चाहते हैं।

एकमात्र समय जब आप वास्तव में उत्परिवर्तनीय और अपरिवर्तनीय वस्तुओं के बीच अंतर के साथ समस्याओं में भाग लेते हैं तो यह है कि अगर आपने वास्तव में सीधे MyString को संशोधित करने का प्रयास किया है (उदाहरण के लिए इसे "ठंडा करें" या कुछ)।

दूसरे शब्दों में, या तो कक्षा आपको किसी भी स्ट्रिंग को किसी अन्य स्ट्रिंग में "बदलने" की अनुमति देगी, लेकिन जिस तरीके से आप इसे करने के लिए उपयोग करते थे, वह बहुत अलग होगा। उदाहरण के लिए, एक म्यूटेबल स्ट्रिंग के साथ "बिल्ली" को "सीएटी" में बदलने के लिए, आप प्रत्येक चरित्र पर फिर से सक्रिय हो सकते हैं और इसे केवल अपरकेस बना सकते हैं (क्योंकि आप एक परिवर्तनीय स्ट्रिंग की सामग्री को संशोधित कर सकते हैं)। दूसरी तरफ, एक अपरिवर्तनीय स्ट्रिंग के साथ, आपको पहले मूल स्ट्रिंग को कहीं और कॉपी करना होगा, इसे संशोधित करना होगा, और फिर अपने वैरिएबल को इस नए एनएसएसटींग को इंगित करने के लिए रीडायरेक्ट करना होगा।

निम्न लिंक उपयोगी हो सकता है: http://www.kirupa.com/forum/showthread.php?t=307928 http://forums.macrumors.com/showthread.php?t=467099

मैं भी कुछ Googling कर की सलाह देते हैं; यह एक प्रश्न है जो सामान्य रूप से विकास से संबंधित है, और यह समझने के लिए अपेक्षाकृत महत्वपूर्ण अवधारणा है। इंटरनेट पर कहीं और मौत पर भी चर्चा की गई है।

+0

क्या यह हर जगह NSMutableString का उपयोग करने के लिए "सुरक्षित" और "अधिक लचीला" होगा? वे कहते हैं कि "मेमोरी लागत" और "गति लागत" है ... लेकिन ... कितना? लाखों के अपने पूल से 20 अतिरिक्त बाइट? या 0.01 सेकंड तक मेरे ऐप को धीमा कर रहा है? ("म्यूटेबल्स के बारे में चिंता करने की ज़रूरत नहीं है" के फायदे इसके लायक हैं।) या यह है? – Donna

+1

यदि आप समवर्ती प्रोग्रामिंग (एकाधिक धागे, इत्यादि) का उपयोग कर रहे हैं तो यह जानना बहुत अच्छा है कि आपकी स्ट्रिंग की सामग्री आपके उपयोग के बीच में नहीं बदलेगी। अगर आपको इसके बारे में चिंता करनी पड़ी, तो आप शायद कुछ और करने से पहले स्ट्रिंग की एक प्रति बना लेंगे ताकि कोई भी इसे बदल न सके। अपरिवर्तनीयता यह बनाती है कि आपको स्ट्रिंग की प्रतिलिपि बनाने की आवश्यकता नहीं है। एनएसएआरएआरई और एनएस डिक्शनरी जैसी बड़ी संरचनाओं के लिए यह और भी महत्वपूर्ण हो जाता है। यदि आपको केवल एक धागा मिला है (यदि आपको पता नहीं है कि इसका मतलब क्या है, तो आपको केवल एक ही मिला है), फिर हर जगह mutables का उपयोग करना शायद ठीक होगा। –

+0

भले ही आप एक से अधिक धागे का उपयोग नहीं कर रहे हैं, यह जानना अच्छा होता है कि कोई ऑब्जेक्ट आपके नीचे से बदल सकता है या नहीं। आम तौर पर मुझे ज्यादातर समय अपरिवर्तनीय डेटा संरचनाओं का उपयोग करना आसान लगता है। अगर मैं एक एनएसएआरएआरई बना देता हूं, तो इसे किसी और को दें और फिर इसका उपयोग जारी रखें, यह जानने में मददगार है कि किसी ने मेरी पीठ के पीछे इसे बदल दिया होगा या नहीं। संक्षेप में, हर जगह म्यूटेबल का उपयोग करना आसान है, लेकिन डीबग करना बहुत मुश्किल है। – rpetrich

11

अगर मैं एक चर घोषित:

NSString * var; 
// Here some code giving a new value to var 

क्या अपरिवर्तनीय है वस्तु var द्वारा इंगित किए नहीं var ही है।

इसका मतलब यह है कि मैं वस्तु का कुछ भी var द्वारा की ओर इशारा नहीं बदल सकते हैं, लेकिन मैं बदल सकते हैं जो वस्तु की ओर इशारा कर रहा है। आपरेशन आप का उल्लेख var पर अनुमति दी है की

कोई नहीं है, लेकिन यदि आप किसी अन्य विभिन्न तार के साथ var असाइन कर सकते हैं:

NSString * anotherVar; 
// Here some code giving a new value to anotherVar 

var = anotherVar; // This is allowed (with a memory leak if GC is disabled) 

// The following is also allowed: -stringWithFormat: creates a new object 
var = [var stringWithFormat:@"%@ with more chars", var]; 
+0

बस ध्यान दें, उस कोड को * नहीं * परिणामस्वरूप जीसी अक्षम के साथ मेमोरी रिसाव होनी चाहिए। आप जो कर रहे हैं वह एक सरल असाइनमेंट है, जिसमें कोई भी नहीं है या -कॉपी शामिल है। इस प्रकार, कोई स्मृति रिसाव नहीं है। इसके अलावा, आपका स्ट्रिंग प्रारूप अधिक वर्णों के साथ @ "% @ होना चाहिए", क्योंकि% s केवल सी-स्ट्रिंग्स के लिए लागू होता है, मुझे विश्वास है। –

+0

धन्यवाद, मैंने प्रारूप अपडेट किया है। स्मृति रिसाव के बारे में, यह इस बात पर निर्भर करता है कि var का पहला मूल्य कैसे बनाया गया है। – mouviciel

2

एक अपरिवर्तनीय स्ट्रिंग (या वास्तव में, किसी भी अपरिवर्तनीय वस्तु) एक ही है कि नहीं किया जा सकता है प्रारंभिकरण के बाद बिल्कुल बदल गया।

यहाँ अपरिवर्तनीय तार का उपयोग कर, (छद्म) छद्म कोड में का लाभ दिया गया है:

// if using mutable strings 
let a = "Hello World"; 
let b = a; 
a.replace("Hello", "Goodbye"); 

अब क्या पकड़ है? "नमस्ते दुनिया"? "अलविदा दुनिया"? अब बी पकड़ क्या है?

तार परिवर्तनशील हैं, तो यह "गुडबाय दुनिया" पैदा हो सकती हैं। यह वही हो सकता है जो आप चाहते हैं। यह नहीं हो सकता है।

अचल स्थिति के साथ, यह बहुत स्पष्ट है कि ख अभी भी मूल स्ट्रिंग के लिए अंक हो जाता है क्योंकि बदलने के विधि वास्तविक स्ट्रिंग परिवर्तित नहीं किया जा सकता है, बल्कि एक नया स्ट्रिंग के लिए एक संदर्भ लौट आए।

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

3

NSString संपादित नहीं किया जा सकता है, हर बार जब आप यह आपत्ति वर्ष स्ट्रिंग वस्तु अनाथ जाएगा और नए स्ट्रिंग वस्तु फिर से बनाने NSString करने के लिए एक स्ट्रिंग मान निर्दिष्ट करते हैं। यदि आप बड़े स्ट्रिंग बफर से निपट रहे हैं तो यह एक महंगा ऑपरेशन है। यदि आप बड़े स्ट्रिंग बफर से निपट रहे हैं तो इष्टतम प्रदर्शन के लिए एनएसएमयूटेबलस्ट्रिंग का उपयोग करें। यह स्ट्रिंग बनाम स्ट्रिंगबिल्डर के समान है .net में।

1

डिफ़ॉल्ट रूप से, NSString उद्देश्य सी भाषा में प्रयोग किया जाता अपरिवर्तनीय है। NSMutableString का प्रयोग & घोषित करने योग्य स्ट्रिंग को परिभाषित करने के लिए किया जाता है। एक अपरिवर्तनीय स्ट्रिंग में कुछ भी नहीं बदला जा सकता है। लंबाई नहीं, पात्र नहीं, कुछ भी नहीं।

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

  • कोई संबंधित समस्या नहीं^_^