2011-08-15 40 views
13

क्या अंतर परिवर्तनशील और अपरिवर्तनीयक्या बीच का अंतर है परिवर्तनशील और अपरिवर्तनीय

तरह

NSString और NSMutableString है।

एनएसएआरएआरई और एनएसएमयूटेबलएरे।

एनएस डिक्शनरी और एनएसएमयूटेबल डिक्शनरी।

क्या परिवर्तनशील वस्तु और अन्य वस्तु [जो मैं अपरिवर्तनीय लगता है] पहले से

@thanks के बीच अंतर है।

+1

एक अच्छा अनुवर्ती प्रश्न * क्यों * एनएसएआरएआरई, एनएसएसटींग, एनएसएसएटी, एनएस डिक्शन इत्यादि * * अपरिवर्तनीय हैं। –

उत्तर

16

एक परिवर्तनशील वस्तु उत्परिवर्तित जा सकता है या बदला हुआ। एक अपरिवर्तनीय वस्तु नहीं कर सकता है। उदाहरण के लिए, जब आप एनएसएमयूटेबलएरे से ऑब्जेक्ट्स जोड़ या निकाल सकते हैं, तो आप या तो एनएसएआरएआरई के साथ नहीं कर सकते हैं।

उत्परिवर्तनीय वस्तुओं में तत्वों को बदल दिया जा सकता है, जोड़ा जा सकता है या हटाया जा सकता है, जो अपरिवर्तनीय वस्तुओं के साथ हासिल नहीं किया जा सकता है। अपरिवर्तनीय वस्तुएं आपके [[object alloc] initWith...] प्रारंभकर्ता में दिए गए इनपुट के साथ फंस गई हैं।

आपके उत्परिवर्तनीय वस्तुओं के फायदे स्पष्ट हैं, लेकिन जब आवश्यक हो तो उन्हें केवल तब उपयोग किया जाना चाहिए (जो आपके विचार से बहुत कम है) क्योंकि वे अपरिवर्तनीय वस्तुओं की तुलना में अधिक स्मृति लेते हैं।

+1

आप प्रतिष्ठा अंक की आवश्यकता के बिना एक जवाब स्वीकार कर सकते हैं। देखें: http://meta.stackexchange.com/questions/91889/how-do-i-accept-an-answer-to-my-questions –

+0

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

+0

यदि आपने अपने ऐप में एनएसएमयूटेबलस्ट्रिंग का इस्तेमाल किया था, तो आपने एनएसएसटींग का इस्तेमाल किया - मुझे लगता है कि आपको एक महत्वपूर्ण प्रदर्शन हिट दिखाई देगी। –

5

एक परिवर्तनीय वस्तु को उत्परिवर्तित या बदला जा सकता है। एक अपरिवर्तनीय वस्तु नहीं कर सकता है। उदाहरण के लिए, जब आप एनएसएमयूटेबलएरे से ऑब्जेक्ट्स जोड़ या निकाल सकते हैं, तो आप या तो एनएसएआरएआरई के साथ नहीं कर सकते हैं।

+0

धन्यवाद ग्लोरिफाइड हैकर। मैं एक्स-मैन फिल्म देखता हूं ताकि म्यूटेंट वहां आवश्यक व्यवहार कर सकें। यहां ऑब्जेक्ट कैसे अपना व्यवहार बदलता है, क्या आप मुझे इसके लिए एक उदाहरण दे सकते हैं ......... मेरे मूवी उदाहरण के बारे में खेद है। – user891268

+0

म्यूटेबल का मतलब यह नहीं है कि ऑब्जेक्ट का व्यवहार बदला जा सकता है, इसका मतलब है कि डेटा बदला जा सकता है। आप "हैलो" युक्त एनएसएमयूटेबल स्ट्रिंग ऑब्जेक्ट में "वर्ल्ड" जोड़ सकते हैं, लेकिन "हैलो" युक्त एनएसएसटींग ऑब्जेक्ट के लिए नहीं। – glorifiedHacker

+0

इसका डेटा धन्यवाद जो ऑब्जेक्ट में परिवर्तनीय में बदला गया है अपरिवर्तनीय नहीं [अपरिवर्तनीय] बहुत दोस्त धन्यवाद। – user891268

2

"mutable" की अंग्रेज़ी परिभाषा वास्तव में आपको यहां की आवश्यकता है। रचनात्मक वस्तुओं को सृजन के बाद संशोधित किया जा सकता है। अपरिवर्तनीय वस्तुओं को सृजन के बाद संशोधित नहीं किया जा सकता है। यह आपके द्वारा सूचीबद्ध सभी कक्षाओं पर लागू होता है।

व्यवहार में, परिवर्तनशील कक्षाओं के सभी अपरिवर्तनीय लोगों के उपवर्गों हैं, और प्रत्येक वस्तु के कार्यक्रम संबंधी संशोधन की अनुमति देने के लिए अपने स्वयं के इंटरफेस कहते हैं addObject:, setObject:forKey:, आदि ...

8

परिवर्त्य वस्तुओं हो सकता है की तरह संशोधित, अपरिवर्तनीय वस्तुएं नहीं कर सकती हैं।

ईजी: एनएसएमयूटेबलएरे में addObject:removeObject: विधियां (और अधिक) हैं, लेकिन एनएसएआरएआरई नहीं है।

संशोधित करना तार:

NSString *myString = @"hello"; 
myString = [myString stringByAppendingString:@" world"]; 

बनाम

परिवर्त्य वस्तुओं विशेष रूप से उपयोगी है जब सरणियों के साथ काम कर रहे हैं,

जैसे आप कर सकते हैं यदि आप NSMutableStrings का एक NSArray है:

[myArray makeObjectsPerformSelector:@selector(appendString:) withObject:@"!!!"]; 

जो 3 जोड़ देगा! सरणी में प्रत्येक स्ट्रिंग के अंत तक।

लेकिन अगर आप NSStrings (इसलिए अपरिवर्तनीय) के एक NSArray है, तो आप ऐसा नहीं कर सकते (कम से कम यह एक बहुत कठिन है, और अधिक कोड है, NSMutableString का उपयोग करने से)

1

उत्परिवर्तनीय बदला जा सकता है, अपरिवर्तनीय नहीं कर सकता। जब आप एक म्यूटेबल ऑब्जेक्ट्स साझा करते हैं, तो आपको उम्मीद करनी चाहिए कि कोई इसे बदल सकता है। जब आप एक अपरिवर्तनीय वस्तु साझा करते हैं, तो आप उम्मीद करते हैं कि कोई भी नहीं बदलेगा।

1

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

5

बुनियादी अंतर है:

  • NSStrings संपादित नहीं किया जा सकता है, केवल पुन: सौंपा। इसका मतलब है कि जब एनएसएसटींग का मान बदलता है, तो यह वास्तव में स्मृति में एक नए स्थान की ओर इशारा करता है।

  • एनएसएमयूटेबल स्ट्रिंग ऑब्जेक्ट्स को उसी पॉइंटर को संपादित और बनाए रखा जा सकता है।

एक आम व्यावहारिक अंतर है:

  • आप 1 NSString और फिर इसे करने के लिए एक दूसरे से दें और इसके बाद संपादित या तो उनमें से एक, वे अब अलग तार की ओर इशारा करते हो जाएगा बनाते हैं ।

  • यदि आप एनएसएमयूटेबलस्ट्रिंग्स के साथ एक ही काम करते हैं, लेकिन फिर उनमें से एक को संपादित करें (इसे पुन: असाइन नहीं करें), तो वे दोनों नए संपादित ऑब्जेक्ट को इंगित करेंगे।

2

हर कोई आप बदल नहीं सकते/एक अपरिवर्तनीय वस्तु को संशोधित कहते हैं। मेरे पास व्याख्या करने का एक अलग तरीका है। आप इसे संशोधित कर सकते हैं, लेकिन फिर आप नई ऑब्जेक्ट पर नया पॉइंटर बनायेंगे, ऐसा नहीं है कि आपने पुरानी ऑब्जेक्ट को संशोधित किया है, यह एक ब्रांड है। नया। वस्तु। कोई भी पॉइंटर जिस पर पहले पॉइंटिंग पॉइंटर था, उसका परिवर्तन नहीं दिखाई देगा। हालांकि अगर यह एक म्यूटेबल ऑब्जेक्ट है, तो इससे पहले की ओर इशारा करते हुए ऑब्जेक्ट नया मान देखेगा। उदाहरण देखें। FYI %p ढेर में सूचक स्थान मुद्रित करता है।

NSString * A = @"Bob"; 
    NSString * B = @"Bob"; 
    NSString * C = @"Bob1"; 
    NSString * D = A; 
    NSLog(@"\n %p for A \n %p for B \n %p for C \n %p for D",A,B,C,D); 

    // memory location of A,B,D are same. 

एक
सी
0x104129068 के लिए बी
0x104129088 के लिए 0x104129068 के लिए D के लिए 0x104129068


सूचक एक की वस्तु को संशोधित

A = @"Bob2"; // this would create a new memory location for A, its previous memory location is still retained by B 
NSLog(@"\n%p for A \n%p for B \n%p for C \n %p for D",A,B,C, D); 

// A has a **new** memory location, B,D have same memory location. 

एक
सी
0x104129068 के लिए बी
0x104129088 के लिए 0x104129068 के लिए D


// NSMutableString * AA = @"Bob"; <-- you CAN'T do this you will get error: Incompatible pointer types initializing NSMutableString with an Expression of type NSString 
    NSMutableString * AA = [NSMutableString stringWithString:@"Bob1"]; 
    NSString * BB = @"Bob"; 
    NSString * CC = @"Bob1"; 
    NSString * DD = AA; 
    NSLog(@"\n %p for AA \n %p for BB \n %p for CC \n %p for DD",AA,BB,CC,DD); 

    // memory location of AA,DD are same. 

0x7ff26af14490 के लिए ए.ए.
0x104129068 के लिए बी बीके लिए 0x1041290c 0x104129088 सीसी के लिए
सीसी
के लिए बी बी
0x104129088 के लिए ए.ए.
0x104129068 के लिए डीडी


संशोधित करना सूचक एए के वस्तु

AA = (NSMutableString*)@"Bob3"; // This would NOT create a new memory location for A since its Mutable-- D was and still pointing to some location 
    NSLog(@"\n%p for AA \n%p for BB \n%p for CC \n %p for D",AA,BB,CC,DD); 

    // memory location of AA,DD are NOT same. 

0x104129128 के लिए 0x7ff26af0x7ff26af14490 डीडी

आप कल्पना कर सकते हैं के रूप में के लिए, सभी NSString प्रॉपर्टी की डिफ़ॉल्ट भंडारण विशेषता retain है। copy & retain पर अधिक जानकारी के लिए मैं अत्यधिक सुझाव देता हूं कि आप इस प्रश्न को पढ़ लें। NSString property: copy or retain?

+0

क्षमा करें, लेकिन यह भ्रमित और गलत का मिश्रण है। आप अपरिवर्तनीय वस्तुओं को संशोधित नहीं कर सकते हैं, आप निश्चित रूप से संदर्भ प्रकार के चर में संग्रहीत मान को संशोधित कर सकते हैं - जिससे कि किस ऑब्जेक्ट को संदर्भित किया जा रहा है, आपको ** कभी भी स्ट्रिंग स्थिरांक को 'NSMutableString *' नहीं होना चाहिए - यह नहीं बनाता है एक परिवर्तनीय स्ट्रिंग, एक चर के लिए असाइनमेंट कुछ भी नया नहीं बनाता है क्योंकि उत्तर सुझाव देता है, आदि – CRD

+0

@CRD क्या आप एक संपादन का सुझाव दे सकते हैं? – Honey

+0

क्षमा करें, नहीं। इसे काफी पुनर्लेखन की आवश्यकता होगी, और यहां अन्य उत्तर भी हैं। – CRD

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