जांचें कि क्या NSString का उदाहरण NSArray में निहित है


80

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

जवाबों:


171

हां, हार्ड-कोडेड NSStrings (स्ट्रिंग शाब्दिक) (जो @"..."आपके स्रोत कोड में कोई भी हो) को ऐसे तार में बदल दिया जाता है जो आपकी प्रक्रिया के चलने के दौरान अनिश्चित काल तक मौजूद रहते हैं।

हालाँकि NSArray के containsObject:तरीके isEqual:इसकी वस्तुओं पर कॉल करते हैं, इसलिए यहां तक ​​कि एक गतिशील रूप से बनाई गई स्ट्रिंग जैसे कि आपके नमूना स्निपेट में [NSString stringWithFormat:@"%d", 2] वापस आ जाएगीYES
ऐसा इसलिए है क्योंकि NSString की isEqual:(या अधिक सटीक रूप से isEqualToString:) विधि को जागरूक करने के लिए लागू किया जाता है (बनाम सूचक पहचान की तुलना) और इस प्रकार YESकिसी भी तार के जोड़े के लिए एक ही क्रम के वर्णों की तुलना में (तुलना के समय), कोई फर्क नहीं पड़ता। जब वे बनाए गए थे।

समान (पॉइंटर-) पहचान के लिए जाँच करने के लिए आपको अपने एरे को एन्यूमरेट करना होगा और उसकी तुलना करनी होगी

(जो आप सबसे अधिक संभावना चाहते हैं, हालांकि) नहीं होगा।

या अधिक सुविधाजनक फैशन में:

(आप सबसे अधिक संभावना यह एक भी नहीं चाहते हैं)।


उपसंहार:

कारण तो आप से एक सकारात्मक जवाब हो रही है containsObject:है नहीं क्योंकि शाब्दिक तार एक ही निरंतर उदाहरण साझा करते हैं, लेकिन क्योंकि containsObject:सम्मेलन कॉल से isEqual:, जो सामग्री के बारे में पता है।

आप NSObject प्रोटोकॉलisEqual: से लघु (लघु) प्रलेखन पढ़ना चाह सकते हैं ।


17

containsObject:एक मान जाँच करता है, एक सूचक जाँच नहीं। यह isEqual:NSObject द्वारा परिभाषित विधि का उपयोग करता है और परीक्षण के लिए अन्य वस्तुओं द्वारा ओवरराइड किया जाता है। इसलिए, यदि दो तारों में वर्णों का क्रम समान है, तो उन्हें समान माना जाएगा।

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

इस कार्यक्रम का आउटपुट है:

2011-04-27 17: 10: 54.686 a.out [41699: 903] ContinString ==
ContinString2 2011-04-27 17: 10: 54.705 a.out [41699: 903] ContinString!} गतिशीलString
2011-04-27 17 ! : 10: 54.706 a.out [41,699: 903] [constantString isEqual: dynamicString] == हाँ
2011-04-27 17: 10: 54.706 a.out [41,699: 903] theArray शामिल हैं:
constantString: 1
constantString2: 1
dynamicString: 1


4

containsObjectयदि कुछ स्ट्रिंग मौजूद है, तो आप इसका पता लगाने के लिए उपयोग कर सकते हैं,

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.