2011-07-06 8 views
8

के बजाय मैं इस + (NSArray *)ids की तरह एक अपरिवर्तनीय सरणी लेकिन इस विधि के अंदर मैं एक NSMutableArray की घोषणा कर रहा हूँ क्योंकि मैं -sortUsingSelector: का उपयोग कर इसे क्रमबद्ध करना चाहते हैं वापस जाने के लिए चाहते हैं, तो विधि।ऑब्जेक्टिव-सी वापसी NSMutableArray लौटने की घोषणा की NSArray वापसी प्रकार

इस विधि को लौटाना सही काम करता है।

  • लेकिन क्या यह कोड लिखने के लिए "ठीक है" है कि यह घोषणा करता है कि वापसी विधि एक प्रकार होनी चाहिए और वास्तव में एक और प्रकार है?

  • क्या यह काम करता है क्योंकि NSMutableArrayNSArray का उप-वर्ग है?

  • वास्तविक वापसी मूल्य NSArray या NSMutableArray है?

+3

किसी भी भाषा में, एक समारोह की वास्तविक वापसी प्रकार एक परिणाम के रूप में घोषित वापसी प्रकार की एक उप-प्रकार हो सकता है [लिस्कोव प्रतिस्थापन सिद्धांत] (http://en.wikipedia.org/wiki/Liskov_substitution_principle)। – outis

उत्तर

6

(...) यह "ठीक" कोड घोषणा करता है कि कि वापसी विधि एक प्रकार होना चाहिए और वास्तव में प्रकार एक और है लिखने के लिए है?

हां, यह प्रदान किया जाता है कि प्रकार संगत हैं; अगला अनुच्छेद देखें। वास्तव में, कोको में कुछ मामले हैं (विशेष रूप से कक्षा क्लस्टर) जो भी ऐसा करते हैं।

क्या यह काम करता है क्योंकि एनएसएमयूटेबलएरे एनएसएआरएआरई का उप-वर्ग है?

बिल्कुल। चूंकि NSMutableArrayNSArray का उप-वर्ग है, इसलिए यह सभी विधियों और घोषित गुणों को प्राप्त करता है, इसलिए यह सार्वजनिक रूप से NSArray जैसा व्यवहार करता है। इसे Liskov substitution principle कहा जाता है।

क्या वास्तविक वापसी मूल्य एनएसएआरएआरई या एनएसएमयूटेबलएरे है?

वापसी मूल्य जो भी आप लौट रहे हैं। चूंकि आप NSMutableArray लौट रहे हैं, यह NSMutableArray है। कॉलर परिप्रेक्ष्य से, यह एक वस्तु है जिसका प्रयोग NSArray जैसा किया जा सकता है।

+5

'NSArray * 'लौटने के रूप में टाइप की गई विधि से एक म्यूटेबल सरणी लौटाना ठीक है, लेकिन' NSArray * 'लौटने के रूप में टाइप की गई विधि से प्राप्त सरणी को म्यूट करना ठीक नहीं है। यदि विधि की घोषणा स्पष्ट रूप से नहीं कहती है कि यह एक म्यूटेबल सरणी देता है, तो आप, कॉलर को यह मानना ​​नहीं चाहिए कि यह एक म्यूटेबल सरणी देता है। यहां तक ​​कि अपने स्वयं के आवेदन के अंदर ऐसा करने का मतलब है कि आप अपना कोड बना रहे हैं जो बहुत अधिक नाजुक है। यदि कक्षा स्वयं को हल करने के लिए अपनी खुद की सरणी बता रही है, तो विधि स्पष्ट रूप से उत्परिवर्तनीय लौटने वाला एक एक्सेसर होना चाहिए। किसी भी अन्य वर्ग को अपनी खुद की परिवर्तनीय प्रतिलिपि बनाना चाहिए। –

+0

@ पीटर होसे: +1। ऐप्पल दस्तावेज़ स्पष्ट रूप से किसी ऑब्जेक्ट को म्यूटेबल के रूप में इलाज करने पर प्रतिबंध लगाते हैं यदि एपीआई इसे अपरिवर्तनीय के रूप में विज्ञापित करता है * भले ही आप इसे पहले जांचें और पाते हैं कि यह परिवर्तनीय है *। – JeremyP

+1

@ जेर और [उत्परिवर्तन के लिए परीक्षण उतना आसान नहीं है जितना प्रारंभ में प्रतीत होता है] (http://stackoverflow.com/q/1788690/557219)। –

2
  • चाहे वह या "ठीक" नहीं एक मुश्किल सवाल है। यदि यह एक छोटी परियोजना है और केवल आप कोड का उपयोग करते हैं, तो यह ठीक हो सकता है। हालांकि, अगर आप "NSArray" को वापस करने में सक्षम होने पर कुछ भी भरोसा नहीं करते हैं, तो यह ठीक नहीं है। (अंतिम बिंदु देखें)

  • हां।

  • यह NSMutableArray है। एक साधारण कलाकार आपको इसमें मूल्यों को बदलने देगा।

आप वास्तव में एक वापसी के लिए एक अपरिवर्तनीय वस्तु चाहते हैं, निम्न कार्य करें:

NSArray* immutableArray = [[mutableArray copy] autorelease]; 
    return immutableArray; 
+0

जीसी या एआरसी के तहत नहीं चलते समय इसे ऑटोरेलीज़ करना न भूलें। –

+0

सच है, इसे प्रतिबिंबित करने के लिए संपादित किया गया। – uvesten

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