मुझे इस पर बीबीएम के जवाब से असहमत होना है। एक NSPointerArray
एक सरणी है, न कि एक स्पैस सरणी है, और दोनों के बीच महत्वपूर्ण अंतर हैं।
मैं दृढ़ता से अनुशंसा करते हैं कि bbums समाधान न किया जाए।
NSPointerArray
के लिए प्रलेखन here उपलब्ध है।
कोको में पहले से ही एक सरणी वस्तु है जैसा कि NSArray
वर्ग द्वारा परिभाषित किया गया है। NSPointerArray
NSObject
से विरासत में है, इसलिए यह NSArray
का प्रत्यक्ष उप-वर्ग नहीं है। हालांकि, NSPointerArray
प्रलेखन जैसे वर्ग की परिभाषा:
NSPointerArray is a mutable collection modeled after NSArray but it can also hold NULL values
मैं प्रलेखन से इस परिभाषा का दावा है कि यह है कि इस NSArray
की एक "तार्किक" उपवर्ग है स्वयंसिद्ध धारणा कर देगा।
परिभाषाएं
एक "सामान्य" सरणी है: आइटम का संग्रह, जिनमें से प्रत्येक के साथ जुड़े एक अद्वितीय सूचकांक संख्या है।
योग्यता के बिना एक सरणी है: एक "सामान्य" सरणी जहां वस्तुओं की अनुक्रमणिका निम्नलिखित गुण हैं: सरणी में वस्तुओं के लिए इंडेक्स 0
से शुरू होते हैं और अनुक्रमिक रूप से बढ़ते हैं। सरणी में सभी वस्तुओं में सरणी में आइटम्स की संख्या से कम सूचकांक संख्या होती है। किसी सरणी में कोई आइटम जोड़ना सरणी में अंतिम आइटम के इंडेक्स + 1 पर होना चाहिए, या किसी आइटम को दो मौजूदा आइटम इंडेक्स नंबरों के बीच डाला जा सकता है, जिसके कारण सभी बाद की वस्तुओं की इंडेक्स संख्या एक से बढ़ाई जा सकती है। किसी मौजूदा इंडेक्स नंबर पर एक आइटम को किसी अन्य आइटम द्वारा प्रतिस्थापित किया जा सकता है और यह ऑपरेशन मौजूदा परिचालनों की अनुक्रमणिका संख्याओं को नहीं बदलता है। इसलिए, दो अलग-अलग संचालन डालें और बदलें।
एक स्पैस सरणी है: एक "सामान्य" सरणी जहां पहले आइटम का इंडेक्स नंबर किसी भी नंबर पर शुरू हो सकता है और सरणी में जोड़े गए बाद की वस्तुओं की इंडेक्स संख्या का कोई अन्य संबंध नहीं है या प्रतिबंध अन्य नियमों के आधार पर नहीं है सरणी। किसी स्पैस सरणी में किसी आइटम को डालने से सरणी में अन्य आइटम्स की अनुक्रमणिका संख्या प्रभावित नहीं होती है। किसी आइटम को सम्मिलित करना और किसी आइटम को प्रतिस्थापित करना आमतौर पर अधिकांश कार्यान्वयन में समानार्थी होता है। स्पैस सरणी में वस्तुओं की संख्या की गिनती स्पैस सरणी में आइटम्स की इंडेक्स संख्याओं से कोई संबंध नहीं है।
ये परिभाषाएं "ब्लैक बॉक्स" सरणी के व्यवहार के बारे में कुछ भविष्यवाणियां करती हैं जो परीक्षण योग्य हैं। सादगी के लिए, हम निम्नलिखित संबंधों पर ध्यान केंद्रित करेंगे:
एक सरणी में, सरणी में सभी वस्तुओं की अनुक्रमणिका संख्या सरणी में आइटम्स की संख्या की गणना से कम है। हालांकि यह एक स्पैस सरणी के बारे में सच हो सकता है, यह एक आवश्यकता नहीं है।
bbum के लिए एक टिप्पणी में, मैं निम्नलिखित ने कहा:
एक NSPointerArray
एक विरल सरणी नहीं है, न ही यह एक की तरह व्यवहार करता है। आपको अभी भी सभी अप्रयुक्त अनुक्रमणिका को NULL
पॉइंटर्स से भरना होगा। एक ताजा NSPointerArray
instantiated पर [pointerArray insertPointer:@"test" atIndex:17];
से आउटपुट:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSConcretePointerArray insertPointer:atIndex:]: attempt to insert pointer at index 17 beyond bounds 0'
यह कहा गया है, साबित बिना, NSPointerArray
के व्यवहार के ऊपर एक विरल सरणी की परिभाषा का उल्लंघन करती है। त्रुटि संदेश का यह हिस्सा खुलासा कर रहा है: attempt to insert pointer at index 17 beyond bounds 0'
, विशेष रूप से सूचकांक 0
पर पहली नई वस्तु जोड़ने के बारे में हिस्सा।
bbum तो टिप्पणियाँ:
यह गलत है। आप कॉल -सेट कॉल करने में विफल रहे: क्षमता को पर्याप्त आकार में सेट करने के लिए।
यह है गैर sensical एक विरल सरणी में आइटम की संख्या की "गिनती सेट" करने के लिए। यदि NSPointerArray
एक स्पैस सरणी थी, तो कोई उम्मीद करेगा कि इंडेक्स 17 पर पहला आइटम जोड़ने के बाद, NSPointerArray
में आइटमों की संख्या की गणना एक होगी। हालांकि, बीबीएमएस सलाह के बाद, पहले आइटम जोड़ने के बाद NSPointerArray
में आइटमों की संख्या 18
है, 1
नहीं है।
QED- यह दिखाया गया है कि NSPointerArray
वास्तव में एक सरणी है, और इस चर्चा के प्रयोजनों के लिए, NSArray
।
साथ ही, bbum निम्नलिखित अतिरिक्त टिप्पणी करता है:
NSPointerArray सबसे निश्चित रूप से समर्थन छेद करता है।
यह साबित रूप से झूठा है। एक सरणी में इसमें शामिल सभी वस्तुओं की आवश्यकता होती है, भले ही वह कुछ 'कुछ नहीं' हो। यह एक स्पैस सरणी के बारे में सच नहीं है। इस चर्चा के प्रयोजनों के लिए यह 'छेद' की परिभाषा है। एक NSPointerArray
में शब्द की स्पैस सरणी भावना में holes
शामिल नहीं है।
वह कक्षा लिखने के पूरे बिंदुओं में से एक था। आपको पहले गिनती सेट करनी होगी।
यह एक स्पैस सरणी के "गिनती सेट" के लिए असंभव है।
चाहे आंतरिक कार्यान्वयन एक स्पैस सरणी है या हैश या, आदि एक कार्यान्वयन विस्तार है।
यह सच है। हालांकि, NSPointerArray
के लिए प्रलेखन इस बात का कोई भी संदर्भ नहीं देता है कि यह आइटमों की अपनी सरणी को कैसे लागू या प्रबंधित करता है। इसके अलावा, यह कहीं भी नहीं बताता है कि NSPointerArray
"कुशलतापूर्वक NULL पॉइंटर्स की एक सरणी प्रबंधित करता है।"
QED- bbum अप्रलेखित व्यवहार कि एक NSPointerArray
कुशलता से आंतरिक रूप से एक विरल सरणी के माध्यम से NULL
संकेत संभालती है पर निर्भर करता है। होने के कारण अनियंत्रित व्यवहार, यह व्यवहार किसी भी समय बदल सकता है, या NSPointerArray
के सभी उपयोगों पर भी लागू नहीं हो सकता है। इस व्यवहार में एक बदलाव आपदा होगा यदि इसमें संग्रहीत उच्चतम सूचकांक संख्या पर्याप्त रूप से बड़ी (~ 2^26) है।
और, वास्तव में, यह स्मृति के एक बड़े हिस्से के रूप में लागू नहीं किया गया है ...
फिर, यह एक निजी कार्यान्वयन विस्तार है कि है अप्रलेखित है। यह अत्यंत खराब प्रोग्रामिंग अभ्यास इस प्रकार के व्यवहार पर निर्भर करता है।
त्वरित उत्तर के लिए धन्यवाद। मैं लगातार लुकअप के समय की उम्मीद कर रहा था लेकिन यह बहुत बुरा नहीं है। उम्मीद है कि मेरे डेटासेट आकार बहुत बड़े नहीं होंगे। धन्यवाद। –
एक शब्दकोश हैशसेट है, यह निरंतर समय लुकअप का समर्थन करता है। – twolfe18
आह! मैं नहीं जानता था कि। मुझे लगता है कि यह लॉग था (एन)। जानकारी के लिए धन्यवाद। –