2009-11-17 7 views
5

उद्देश्य सी NSMutableString प्रदान करने के बजाय क्लास एनएसएसटींग और सबक्लास एनएसएमयूटेबलस्ट्रिंग दोनों प्रदान क्यों करता है? "एनएसटीयूटेबल स्ट्रिंग" के बराबर एनएसएसटींग नहीं है?एनएसएमयूटेबलस्ट्रिंग और एनएसएसटींग दोनों का उद्देश्य क्या है?

सी ++ में, आपके पास केवल एक स्ट्रिंग क्लास, std :: स्ट्रिंग है, और यदि आप निरंतर चाहते हैं तो आप एक कॉन्स std: स्ट्रिंग घोषित करें।

मुझे यह जानने में दिलचस्पी है कि मुझे हर जगह एनएसएमयूटेबलस्ट्रिंग का उपयोग क्यों नहीं करना चाहिए और कभी भी एनएसएसटींग से परेशान नहीं होना चाहिए? एक कारण होना चाहिए, या भाषा डिजाइनर दोनों प्रदान नहीं करेंगे। शायद यह कम भंडारण या कुछ लेता है?

उत्तर

5

दोनों वर्गों का कारण एक ही कारण है कि आप कभी-कभी std :: स्ट्रिंग का उपयोग करते हैं और कभी-कभी एक const std :: string का उपयोग करते हैं। हालांकि, सी ++ के विपरीत, उद्देश्य-सी में कॉन्स विधियां नहीं हैं, इसलिए वे गैर-कॉन्स्ट-विधियों से दो अलग-अलग वर्गों में अलग-अलग हैं। यह एनएसएआरएआरई (एनएसएमयूटेबलएरे), एनएस डिक्शनरी (एनएसएमयूटेबल डिक्शनरी), आदि

0

मैं कहूंगा कि सामान्य नियम "उस वर्ग का उपयोग न करें जिसका उद्देश्य उस कार्यक्षमता को प्रदान करना है जिसकी आपको आवश्यकता नहीं है"। यदि आपको सीधे स्ट्रिंग की सामग्री को बदलने की आवश्यकता है, तो NSMutableString का उपयोग करें। यदि नहीं, NSString का उपयोग करें। आकार के मामले में और वे कितनी ढेर जगह लेते हैं, कक्षाएं स्वयं बहुत समान होनी चाहिए।

+0

मैं समझता हूं कि किस वर्ग का उपयोग करना है। मेरा सवाल यह है कि क्यों भाषा डिजाइनरों ने कार्यक्षमता को दो वर्गों में विभाजित करना चुना? – progrmr

+0

क्योंकि कार्यक्षमता को विभाजित करने से संकलक और रनटाइम उन मामलों में उच्च प्रदर्शन प्रदान करने की अनुमति देता है जहां अतिरिक्त कार्यक्षमता की आवश्यकता नहीं होती है। –

5

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

वास्तव में

NSString *A = @"Bob"; 
NSString *B = @"Bob"; 
डीबगर में

चल तुरंत पता चलता है कि वे एक ही स्ट्रिंग के लिए दोनों संकेत दिए गए हैं। वास्तव में

NSString *C = [NSString stringWithString:@"Bob"]; 
NSString *D = [A copy]; 

दोनों एक ही स्मृति पते पर भी इंगित करते हैं। इस बीच

NSString *E = [NSMutableString stringWithString:@"Bob"]; 

एक अलग स्ट्रिंग के लिए अंक।

तो हाँ, कुछ मामलों में एनएसएसटींग्स ​​का उपयोग करना अधिक कुशल है। और सामान्य कोको में एक संपादित व्यक्ति की बजाय स्ट्रिंग की एक नई प्रतिलिपि वापस करने के लिए खुद को उधार देता है। हालांकि, मैं वास्तव में तर्क नहीं दे सकता कि आपको हर जगह एक परिवर्तनीय स्ट्रिंग का उपयोग नहीं करना चाहिए, लेकिन यह ढांचे के लिए सामान्य दिशानिर्देशों के खिलाफ प्रतीत होता है।

अपने स्वयं के काम में मैं केवल परिवर्तनीय रूपों का उपयोग करता हूं जहां मुझे चीजों को सीधे संपादित करने की आवश्यकता होती है। जब तक आपको किसी कॉन्स की आवश्यकता न हो, तब तक यह सबकुछ परिवर्तनीय की सी/सी ++ शैली से थोड़ी सी पीछे की ओर है, जब तक कि आपको उत्परिवर्तन की आवश्यकता न हो, सबकुछ स्थिर हो जाता है।

+0

'एनएसएसटींग * डी = [ई कॉपी] के बारे में क्या; 'क्या यह' ई' या किसी अन्य नई स्ट्रिंग पर इंगित करेगा? –

0

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

+0

मेरे परीक्षणों के अनुसार यह रनटाइम व्यवहार के तरीके को भी प्रभावित करता है। –

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