कहाँ अंतर के बीच setObject: forKey: और setValue: forKey: NSMutableDictionary में?


153

दस्तावेज को देखते समय, मुझे शायद ही कोई बड़ा अंतर दिखाई देता है। दोनों "मूल्य" और "वस्तु" प्रकार आईडी के हैं , इसलिए कोई भी वस्तु हो सकती है। कुंजी एक बार एक स्ट्रिंग है, और दूसरे मामले में एक आईडी है। उनमें से एक वस्तु को बनाए रखना प्रतीत होता है, और दूसरा नहीं। और क्या? कौन सा क्या मामले के लिए है?


जवाबों:


163

setValue:forKey:NSKeyValueCoding प्रोटोकॉल का एक हिस्सा है , जो अन्य बातों के अलावा, आपको इंटरफ़ेस बिल्डर की पसंद से ऑब्जेक्ट प्रॉपर्टी तक पहुंचने देता है। setValue:forKey:के अलावा अन्य वर्गों में लागू किया गया है NSDictionary

setObject:forKey:NSMutableDictionary'sअस्तित्व का कारण है। इसका हस्ताक्षर काफी हद तक सेटवैल्यू के समान होता है: forKey :,, लेकिन अधिक जेनेरिक (जैसे कोई भी कुंजी प्रकार) है। यह कुछ हद तक एक संयोग है कि हस्ताक्षर इतने ही हैं।

इस भ्रम में क्या शामिल है कि NSMutableDictionary के कार्यान्वयन के ज्यादातर मामलों में setValue:forKey:बराबर है setObject:forKey:। अन्य वर्गों में, setValue:forKey:सदस्य चर बदलता है। में NSMutableDictionary, यह प्रविष्टियों शब्दकोश बदलता है जब तक आप एक '@' चरित्र के साथ कुंजी उपसर्ग - जिस स्थिति में यह सदस्य चर संशोधित करता है।

इसलिए, संक्षेप में, setObject:forKey:जब आपको शब्दकोश कुंजियों और मूल्यों के साथ काम करने की आवश्यकता होती है, और setValue:forKey:दुर्लभ मामलों में जहां आपको केवीपी से निपटने की आवश्यकता होती है ।

संपादित करें: और ओह, ऐसा लगता है कि यह पहले पूछा गया है और उत्तर दिया गया है: ObjectForKey और valueForKey के बीच अंतर?


यह सवाल बिलकुल नहीं है। यह
गेट्टर

1
आपका क्या मतलब है "NSMutableDictionary में, यह शब्दकोश प्रविष्टियों को बदल देता है, जब तक कि आप कुंजी को '@' वर्ण के साथ उपसर्ग नहीं करते हैं - जिस स्थिति में यह सदस्य चर को संशोधित करता है।" क्या सदस्य चर? इसके अलावा शायद आप stackoverflow.com/questions/5755917 पर टिप्पणी कर सकते हैं ? धन्यवाद।
पीटर Štibraný

पूर्णता के लिए, सेटऑब्जेक्ट: forKey (अपवाद) को बढ़ा देगा यदि ऑब्जेक्ट शून्य है। सेटवैल्यू: forKey समान व्यवहार करेगा, या कुंजी के लिए nil सेट करते समय यह शब्दकोष से मौजूदा ऑब्जेक्ट को हटा देगा?
माटी शनीर

बहुत बढ़िया जवाब। वास्तव में। पूर्णता के लिए, हालांकि, यह उल्लेख करना अच्छा होगा कि (NSMutableDictionary पर कम से कम) setValue: forKey: शून्य मानों को सहन करता है, और प्रविष्टि को हटा देता है - जबकि setObject: forKey: शून्य मानों को सौंपने पर अपवाद और क्रैश को फेंक देगा।
मोतिन शेर

83

एक और अंतर यह है कि यदि आप शून्य मान देते हैं setValue:forKey:, तो यह शब्दकोष से कुंजी को हटा देता है यदि यह मौजूद है, अन्यथा कुछ भी नहीं है। लेकिन अगर आप शून्य मान देते हैं setObject:forKey:, तो यह एक अपवाद को जन्म देता है।


10
यह जानने के लिए सुपर उपयोगी है। अन्यथा मैंने इसे पूरा करने के लिए NSMutableDictionary पर अपनी खुद की श्रेणी लिखी थी। साभार
अरमान

2
एक अन्य अंतर ऑब्जेक्टिव-सी सबस्क्रिप्टिंग के साथ है, आप dic[key] = value;मान को हटाने के लिए कुंजी को लिखने के लिए लिख सकते हैं nilsetValue:forKey:इसे पूरा करने की तुलना में आमतौर पर सदस्यता एक बेहतर तरीका है ।
Cœur

9

-setValue:forKey:केवल -setObject:forKey:रिसीवर को भेजें , जब तक कि मूल्य नहीं है nil, जिस स्थिति में भेजते हैं -removeObjectForKey

मृत सरल।


ओह, तुम सही हो, भाई। उसके लिए माफ़ करना। यह यहाँ प्रलेखित है: developer.apple.com/reference/foundation/nsmutabledfox/…
एडी

4

aObject - कुंजी का मान। इसमें जोड़े जाने से पहले ऑब्जेक्ट एक बरकरार संदेश प्राप्त करता हैNSDictionary । यह मान शून्य नहीं होना चाहिए।

aKey - मूल्य की कुंजी। कुंजी को कॉपी किया जाता है (उपयोग करते हुए copyWithZone:; कुंजियों के अनुरूप होना चाहिएNSCopying प्रोटोकॉल के )। कुंजी शून्य नहीं होनी चाहिए।

मूल्य - कुंजी के लिए मूल्य।

कुंजी - मूल्य के लिए कुंजी। ध्यान दें कि कुंजी-मूल्य कोडिंग का उपयोग करते समय, कुंजी को एक स्ट्रिंग होना चाहिए ("कुंजी-मूल्य कोडिंग बुनियादी बातों" देखें)।


Atual कारण देने के लिए धन्यवाद क्यों setObject: forKey: एक अपवाद उठाता है। @breakfreehg
simbesi.com
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.