2008-12-26 13 views
5

यह प्रश्न इस one. से निकला है जो कोको में structs की सूचियों के साथ काम करना आसान नहीं है। या तो एनएसएआरएआरई और एनकोड/डीकोड का उपयोग करें, या सी प्रकार सरणी का उपयोग करें और एनएसएआरएआरई की वस्तुओं को खो दें। संरचनाओं को सरल माना जाता है, लेकिन जब एक सूची की आवश्यकता होती है, तो कोई इसके बजाय कक्षा का निर्माण करता है।क्या structs की सूचियों का उपयोग कोको में समझ में आता है?

structs की सूचियों का उपयोग करते समय कोको में समझ में आता है?

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

+0

केवीसी और बाइंडिंग कुछ वस्तु बनाने के लिए केवल दो कारण नहीं हैं। दूसरों के बीच बॉक्स/अनबॉक्स के बिना इसे संग्रह ऑब्जेक्ट में रखने में सक्षम है। आप आसानी से परीक्षण कर सकते हैं कि कुछ उस प्रकार का ऑब्जेक्ट है-structs के साथ संभव नहीं है। –

उत्तर

11

कोको में कुछ सामान्य प्रकार हैं जो structs हैं, वस्तुओं नहीं: एनएसपीओएन, एनएसआरईटी, एनएसआरेंज (और उनके सीजी समकक्ष)।

संदेह में, कोको के नेतृत्व का पालन करें। यदि आप खुद को बड़ी संख्या में छोटी, अधिकतर डेटा ऑब्जेक्ट्स से निपटते हैं, तो आप दक्षता के लिए उन्हें structs बनाना चाहते हैं।

एनएसएआरएआरई/एनएसएमयूटेबलएरे का उपयोग शीर्ष-स्तर के कंटेनर के रूप में करते हुए, और NSValue में structs को लपेटने से आपके जीवन को बहुत आसान बना दिया जाएगा। यदि आप एनएसएआरएआर को प्रदर्शन बाधा बनने के लिए पाते हैं, या संभवत: यदि सरणी अनिवार्य रूप से केवल पढ़ने के लिए है तो मैं केवल सीधी प्रकार के सरणी पर जाउंगा।

1

सामान्य रूप से, एक संरचना का उपयोग अपेक्षाकृत सरल डेटा प्रकार के अस्तित्व का तात्पर्य है जिसमें इसके साथ कोई तर्क नहीं है और न ही इसके साथ कोई तर्क होना चाहिए। उदाहरण के लिए NSPoint लें - यह केवल एक (एक्स, वाई) प्रतिनिधित्व है। यह देखते हुए, इसके उपयोग से उत्पन्न होने वाले कुछ मुद्दे भी हैं। आम तौर पर, यह इस प्रकार के डेटा के लिए ठीक है क्योंकि हम आमतौर पर बिंदु के वाई-समन्वय के बजाय बिंदु में परिवर्तन के लिए देखते हैं (मूल रूप से, (0,1) समान नहीं है (1,1) स्थानांतरित होता है 1 इकाई से नीचे)। यदि यह एक अवांछित व्यवहार है, तो कक्षा का उपयोग करना बेहतर विचार हो सकता है।

2

कई बार structs का उपयोग करने के लिए सुविधाजनक और उपयोगी होता है, खासकर जब आपको सी को छोड़ना होता है, जैसे मौजूदा पुस्तकालय के साथ काम करना या सिस्टम स्तर की सामग्री करना। कभी-कभी आप कक्षा के ऊपरी हिस्से के बिना एक कॉम्पैक्ट डेटा संरचना चाहते हैं। यदि आपको ऐसे structs के कई उदाहरणों की आवश्यकता है, तो यह प्रदर्शन और स्मृति पदचिह्न पर वास्तविक प्रभाव डाल सकता है।

structs की एक सरणी करने का एक और तरीका NSPointerArray कक्षा का उपयोग करना है। इसे स्थापित करने के लिए थोड़ा और विचार लगता है लेकिन यह उसके बाद एनएसएआरएआरई की तरह काफी काम करता है और आपको कक्षा में बॉक्सिंग/अनबॉक्सिंग या रैपिंग से परेशान नहीं होना पड़ता है, इसलिए डेटा तक पहुंच अधिक सुविधाजनक होती है, और यह नहीं एक वर्ग की अतिरिक्त स्मृति ले लो।

NSPointerFunctions *pf = [[NSPointerFunctions alloc] initWithOptions:NSPointerFunctionsMallocMemory | 
          NSPointerFunctionsStructPersonality | 
          NSPointerFunctionsCopyIn]; 
pf.sizeFunction = keventSizeFunction; 
self.pending = [[NSPointerArray alloc] initWithPointerFunctions:pf]; 
+0

आईफोन एसडीके का उपयोग करने वाले लोगों के लिए: आईएसपी के लिए एनएसपीइंटरएरे उपलब्ध नहीं है। – Felixyz

+2

आईएसओ 6.0 + में आईएसपी पर NSPointerArray उपलब्ध है – afarnham

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