2011-05-24 17 views
7

के साथ ऑब्जेक्ट कुंजियां मैं मुख्य मूल्य जोड़ों का एक गुच्छा स्टोर करना चाहता हूं, जिसमें मेरा स्वयं का ऑब्जेक्ट (ऑब्जेक्टए) है जो एनएसओब्जेक्ट से प्राप्त होता है, और मान int है।
मैं एक एनएसएमयूटेबल डिक्शनरी का उपयोग करने की कोशिश कर रहा हूं। मैं समझता हूँ कि आप शब्दकोश में केवल दुकान वस्तु प्रकार, तो मैं निम्नलिखित हो सकता है:एनएसएमयूटेबल डिक्शनरी (ऑब्जेक्टिव-सी)

id value = [NSNumber numberWithInt:my_number]; 

[[self dictionary] setObject:value forKey:myObjectA]; 

अब जब कि मुझे एक त्रुटि देता है, कह रही है

- [ObjectA copyWithZone:]: गैर मान्यता प्राप्त चयनकर्ता भेजा उदाहरण

जो ठीक है, मैं समझता हूँ कि वस्तु कुंजी NSCopying प्रोटोकॉल लागू करने की जरूरत है। हालांकि मैंने पढ़ा है कि आप NSValue का उपयोग करके अपनी ऑब्जेक्ट्स को लपेटकर ऐसा कर सकते हैं।

क्या कोई कृपया बता सकता है कि मैं अपनी वस्तुओं को कैसे लपेटूंगा, और फिर मैं कुंजी द्वारा मूल्य कैसे प्राप्त कर सकता हूं? क्या मैं अभी भी dictionary objectForKey:myObjectA का उपयोग करने में सक्षम हूं या क्या मुझे खोज कर रहा हूं, जबकि मुझे NSOalue ऑब्जेक्ट के साथ myObjectA को लपेटना है? या क्या मुझे अपनी कस्टम कक्षा पर एनएससीपीआईपी लागू करना चाहिए, या इसके बजाय स्ट्रिंग कुंजी का उपयोग करना चाहिए?

मैं एक शब्दकोश का उपयोग करने के लिए यह सबसे आसान और आसान तरीका ढूंढ रहा हूं, अगर मुझे एक स्ट्रिंग कुंजी लागू करना है और setValue का उपयोग करना है: forKey: इसके बजाय, लेकिन अगर मैं कर सकता हूं तो मैं ऑब्जेक्ट कुंजी का उपयोग करूंगा।

उत्तर

10

शब्दकोश कुंजी हमेशा कॉपी की जाती है। तो आपको बस अपनी कक्षा के लिए NSCopying प्रोटोकॉल को लागू करने की आवश्यकता है, जो केवल copyWithZone: विधि है।

इसके अतिरिक्त आपको अपनी कक्षा के लिए isEqual: विधि लागू करनी चाहिए।

संपादित करें: कैसे लागू करने के लिए अपने copyWithZone: कारकों की एक संख्या (उदाहरण: डीप बनाम उथले प्रतिलिपि मुख्य कारक) पर निर्भर करता है। ऐप्पल की Implementing Object Copy मार्गदर्शिका और this SO answer देखें।

+0

क्या आप मेरी अपनी कक्षा में अपनी प्रतिलिपिथोन कार्यान्वयन में जो कुछ भी डालेंगे, उसे शामिल करने के लिए आपको जवाब दे सकते हैं? – link664

+0

@ link664: मेरा उत्तर अपडेट किया गया। – DarkDust

+2

यदि आप '-इस एक्वाल' लागू करते हैं, तो आपको '-शैश' लागू करने की आवश्यकता है: यदि दो ऑब्जेक्ट्स '-इस एक्वाल' द्वारा निर्धारित अनुसार बराबर हैं, तो उनके पास एक ही हैश मान होना चाहिए। – JeremyP

6

आप के साथ एक NSValue में एक id बदल सकती है:

NSValue* value = [NSValue valueWithNonretainedObject:object]; 
... 
id object_ = [value nonretainedObjectValue]; 

लेकिन आप शब्दकोश के बाहर स्वामित्व का प्रबंधन करने की जरूरत है। यह एक गड़बड़ होने जा रहा है। एनएससीपीआईपी को अपनाना बेहतर है।


वहाँ भी एक 4 विकल्प है: एक CFDictionary है, जो वस्तु केवल CFRetain किया जा सकता है/CFReleased, नहीं की नकल की अनुमति देता है का उपयोग करें।

CFMutableDictionaryRef dict = CFDictionaryCreateMutable(
    kCFAllocatorDefault, 0, 
    &kCFTypeDictionaryKeyCallBacks, 
    &kCFTypeDictionaryValueCallBacks 
); 

... 

CFDictionarySetValue(dict, myObjectA, value); 
... 

CFRelease(dict); 

और अगर आप मैक या iOS 6 और अधिक के लिए प्रोग्रामिंग कर रहे हैं, NSMapTable प्रयास करें।

NSMapTable* dict = [[NSMapTable mapTableWithStrongToStrongObjects] retain]; 
... 
[dict setObject:@"?" forKey:foo]; 
... 
[dict release]; 
+0

NSValue का उपयोग करने पर टिप के लिए धन्यवाद। मुझे उस उपयोगिता से अवगत नहीं था और यह वही था जो मुझे चाहिए था। समस्या के लिए एक और apropos समाधान लगता है। –

0

आपको NSValue का उपयोग करके अपनी वस्तु को लपेटने की आवश्यकता नहीं है। आपके पास एक टुकड़ा गायब होने के अलावा आपके पास क्या काम करेगा। MyObjectA की कक्षा के लिए आपको एनएससीपीआईपी प्रोटोकॉल को अपनाने की आवश्यकता है (the docs देखें कि क्या जोड़ना है)। एक बार यह जोड़ा गया है कि आपने ऊपर पोस्ट किया गया कोड सही ढंग से काम करना चाहिए।

आप कुंजी के लिए अपने स्वयं के ऑब्जेक्ट पर स्ट्रिंग का उपयोग करने पर विचार करना चाहेंगे। यदि कुंजी-मूल्य कोडिंग का उपयोग करने के लिए इसका उपयोग किया जा रहा है तो कुंजी को स्ट्रिंग होने की आवश्यकता है। इसलिए स्ट्रिंग का उपयोग करके जीवन आसान हो जाएगा यदि आप शब्दकोश का उपयोग कर कहीं भी कुंजी-मूल्य कोडिंग का लाभ उठा सकते हैं।

2

आईओएस 6 में आप एनएसएमएपीटेबल (https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/NSMapTable_class/Reference/NSMapTable.html) का उपयोग कर सकते हैं, जो आपको कुंजी और ऑब्जेक्ट्स के लिए कमजोर/मजबूत विशेषताओं को चुनने की अनुमति देता है।

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