दिलचस्प पोस्ट
Google सेवा खाते से Google कैलेंडर ईवेंट संपादित करें: 403 क्या मैं मक्खी पर मोबाइल सफारी में व्यूपोर्ट मेटा टैग बदल सकता हूं? क्या मैं UIWebViewDelegate के अंदर चेतावनी को संभाल सकता हूँ? इंटरनेट एक्सप्लोरर 8 में jQuery का मुद्दा कैसे स्क्वैश git में धक्का दिया गया है के बाद? एसक्यूएल 'लिखे' को LINQ से निकाय के साथ कैसे उपयोग करें? MongoDB अनुक्रमित कॉलम पर गिनती (विशिष्ट एक्स) का चयन करें – बड़े डेटा सेटों के लिए अनन्य परिणामों की गणना करें प्लस साइन इन क्वेरी स्ट्रिंग चयनित नोड, उसके लिंक, और उसके बच्चों को डी 3 बल निर्देशित ग्राफ़ में हाइलाइट करें कैसे जाँचने के लिए कि एक स्ट्रिंग एक डबल करने के लिए parseable है? मैं एक ऐसी तालिका के लिए एसक्यूएल कैसे लिख सकता हूँ जो MySQL में संरक्षित कीवर्ड के समान नाम को साझा करता है? एक सेवा से यूआई थ्रेड हैंडलर एक्सेस करना MVC4 enum और रेडियो बटन सूची जावा में एक फ़ाइल की प्रतिलिपि करने के लिए मानक संक्षिप्त तरीके? क्या कार्यात्मक प्रोग्रामिंग गोफ डिजाइन पैटर्न को बदलता है?

स्ट्रिंग स्ट्रिंग और स्ट्रिंग स्ट्रेटल के बीच अंतर क्या है?

मैं उद्देश्य-सी और कोको सीख रहा हूं और इस कथन में आया हूं:

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

मैंने केवल उच्च स्तरीय भाषाओं में काम किया है, इसलिए कभी भी स्ट्रिंग्स के ब्योरे पर विचार नहीं किया जा सकता है स्ट्रिंग स्ट्रिंग और स्ट्रिंग स्ट्रेटल के बीच अंतर क्या है?

Solutions Collecting From Web of "स्ट्रिंग स्ट्रिंग और स्ट्रिंग स्ट्रेटल के बीच अंतर क्या है?"

उद्देश्य-सी में, वाक्यविन्यास @"foo" NSString का एक अपरिवर्तनीय , शाब्दिक उदाहरण है। माइक का मानना ​​है कि यह स्ट्रिंग से एक निरंतर स्ट्रिंग नहीं बनाता है।

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

दूसरी ओर लगातार स्ट्रिंग्स को आम तौर पर घोषित किया जाता है और इस तरह वाक्यविन्यास का प्रयोग किया जाता है:

 // MyExample.h - declaration, other code references this extern NSString * const MyExampleNotification; // MyExample.m - definition, compiled for other code to reference NSString * const MyExampleNotification = @"MyExampleNotification"; 

यहां वाक्यात्मक अभ्यास का मुद्दा यह है कि आप स्ट्रिंग का उपयोग करके यह सुनिश्चित करके कुशल बना सकते हैं कि उस स्ट्रिंग का केवल एक ही उदाहरण में एक ही पता स्थान में कई चौखटे (साझा लाइब्रेरी) में उपयोग किया जा सकता है। ( const कीवर्ड मामलों की नियुक्ति; यह गारंटी देता है कि संकेतक खुद ही निरंतर होने की गारंटी देता है।)

जबकि जलती हुई स्मृति एक बड़ा सौदा नहीं है क्योंकि यह 8 मेगापिक्सल RAM के 25 मेगाहर्टज 68030 वर्कस्टेशन के दिनों में हो सकता है, समानता के लिए तार की तुलना करना समय ले सकती है। यह सुनिश्चित करना कि अधिकतर समयावधि स्ट्रिंग जो बराबर होती हैं, वह भी संकेतक-बराबर होंगे

कहते हैं, उदाहरण के लिए, आप किसी ऑब्जेक्ट से नामों की सूचनाओं की सदस्यता लेना चाहते हैं। यदि आप नामों के लिए गैर-निरंतर स्ट्रिंग का उपयोग करते हैं, तो NSNotificationCenter ने अधिसूचना पोस्ट करने में बहुत बाइट-बाय- NSNotificationCenter स्ट्रिंग तुलना करते हुए तय किया था कि इसमें कौन दिलचस्पी है। अगर इनमें से अधिकतर तुलना शॉर्ट-सर्किट होती है क्योंकि स्ट्रिंग की तुलना में समान पॉइंटर है, यह एक बड़ी जीत हो सकती है

कुछ परिभाषाएं

एक शाब्दिक मूल्य है, जो परिभाषा के द्वारा अपरिवर्तनीय है। जैसे: 10
एक निरंतर एक पठन-केवल चर या संकेतक है। उदाहरण: const int age = 10;
स्ट्रिंग शब्दशः एक अभिव्यक्ति है जैसे @"" संकलक NSString एक उदाहरण के साथ इसे प्रतिस्थापित करेगा।
स्ट्रिंग स्ट्रिंग एक पठन-केवल सूचक NSString । उदा: NSString *const name = @"John";

अंतिम पंक्ति पर कुछ टिप्पणियां:

  • यह एक स्थिर सूचक है, निरंतर ऑब्जेक्ट नहीं है 1 objc_sendMsg 2 को परवाह नहीं है अगर आप const साथ ऑब्जेक्ट को अर्हता प्राप्त करते हैं अगर आप एक अपरिवर्तनीय वस्तु चाहते हैं, तो आपको ऑब्जेक्ट 3 के अंदर अपरिवर्तनीयता को कोड देना होगा।
  • सभी @"" अभिव्यक्ति वास्तव में अपरिवर्तनीय हैं। उन्हें संकलन के समय 4 पर NSConstantString उदाहरण के साथ बदल दिया NSConstantString , जो एक निश्चित स्मृति लेआउट 5 के साथ NSString एक विशेष उप-वर्ग है। यह भी बताता है कि क्यों NSString एकमात्र ऐसा ऑब्जेक्ट है जिसे संकलन समय 6 में शुरू किया जा सकता है।

एक स्थिर स्ट्रिंग const NSString* name = @"John"; जो NSString const* name= @"John"; समतुल्य है NSString const* name= @"John"; । यहां, वाक्यविन्यास और प्रोग्रामर इरादा दोनों गलत हैं: const <object> को नजरअंदाज किया गया है, और NSString उदाहरण ( NSConstantString ) पहले से ही अपरिवर्तनीय था

1 कीवर्ड const लागू होता है जो इसके बाईं ओर तुरंत होता है पर लागू होता है यदि इसके बाईं ओर कुछ भी नहीं है, तो यह उसके दाहिनी ओर तुरंत जो भी हो, पर लागू होता है

2 यह फ़ंक्शन है जो रनटाइम उद्देश्य-सी में सभी संदेशों को भेजने के लिए उपयोग करता है, और इसलिए किसी ऑब्जेक्ट की स्थिति को बदलने के लिए आप क्या उपयोग कर सकते हैं।

3 उदाहरण: const NSMutableArray *array = [NSMutableArray new]; [array removeAllObjects]; const NSMutableArray *array = [NSMutableArray new]; [array removeAllObjects]; const पिछले बयान को रोक नहीं है

4 RewriteModernObjC::RewriteObjCStringLiteral कोड जो अभिव्यक्ति को RewriteModernObjC::RewriteObjCStringLiteral लिखता है वह है RewriteModernObjC::RewriteObjCStringLiteral इन रीवरइट मॉडेन ओबीजेसी सीपीपी।

5 NSConstantString परिभाषा को देखने के लिए, सीएमडी + Xcode में इसे क्लिक करें

6 अन्य वर्गों के लिए संकलन समय स्थिर बनाना आसान होगा, लेकिन संकलक को एक विशेष उप-वर्ग का उपयोग करने की आवश्यकता होगी। यह पुराने उद्देश्य-सी संस्करणों के साथ संगतता को तोड़ देगा।


आपके उद्धरण पर वापस जाएं

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

यह कहते हैं कि शाब्दिक त्रुटि प्रवण हैं। लेकिन यह नहीं कहता कि वे भी धीमी हैं की तुलना करें:

 // string literal [dic objectForKey:@"a"]; // string constant NSString *const a = @"a"; [dic objectForKey:a]; 

दूसरे मामले में मैं const पॉइंटर्स के साथ चाबियाँ का उपयोग कर रहा हूं, इसलिए [a isEqualToString:b] बजाय, मैं (a==b) कर सकता हूँ। isEqualToString: का कार्यान्वयन isEqualToString: हैश की तुलना करता है और फिर सी फ़ंक्शन strcmp चलाता है, इसलिए यह पॉइंटर्स की सीधे तुलना की तुलना में धीमी है। यही वजह है कि निरंतर तार बेहतर होते हैं: वे तुलना करने के लिए तेज़ और त्रुटियों से कम प्रवण होते हैं।

यदि आप अपनी निरंतर स्ट्रिंग को वैश्विक मानना ​​चाहते हैं, तो ऐसा करें:

 // header extern NSString *const name; // implementation NSString *const name = @"john"; 

चलिए सी ++ का उपयोग करते हैं, चूंकि मेरा उद्देश्य सी बिल्कुल गैर-मौजूद है।

यदि आप एक स्थिर चर में एक स्ट्रिंग छिपाना:

 const std::string mystring = "my string"; 

अब जब आप तरीके कॉल करते हैं, तो आप my_string का उपयोग करते हैं, आप एक स्ट्रिंग स्थिरता का उपयोग कर रहे हैं:

 someMethod(mystring); 

या, आप उन विधियों को सीधे स्ट्रिंग के साथ कॉल कर सकते हैं:

 someMethod("my string"); 

कारण, संभाव्यतः, कि वे आपको स्ट्रिंग स्थिरांक का उपयोग करने के लिए प्रोत्साहित करते हैं क्योंकि उद्देश्य सी "इंटर्निंग" नहीं करता है; वह है, जब आप कई स्थानों में एक ही स्ट्रिंग का प्रयोग करते हैं, तो यह वास्तव में एक अलग संकेतक है जो स्ट्रिंग की एक अलग प्रति की ओर इंगित करता है।

शब्दकोश कुंजी के लिए, यह एक बहुत बड़ा फर्क पड़ता है, क्योंकि अगर मैं देख सकता हूँ कि दो पॉइंटर्स एक ही बात की ओर इशारा कर रहे हैं, तो स्ट्रिंग के बराबर मान सुनिश्चित करने के लिए एक पूर्ण स्ट्रिंग की तुलना करने के लिए बहुत सस्ता है।

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