2012-02-14 12 views
8

मैं एप्पल के दस्तावेज़ीकरण को देखकर उलझन में हूं और कोको डिजाइन पैटर्न के माध्यम से पढ़ रहा हूं। copyWithZone: के लिए एप्पल प्रलेखन में, इसे पढ़ता है:कॉपी या कॉपी ओवरराइड WithZone: या दोनों?

इस विधि से मौजूद है तो वर्ग ऑब्जेक्ट स्थितियों में, जहां आप एक वस्तु है कि NSCopying प्रोटोकॉल के अनुरूप की जरूरत में इस्तेमाल किया जा सकता है। उदाहरण के लिए, यह विधि आपको क्लास ऑब्जेक्ट को NSDictionary ऑब्जेक्ट की कुंजी के रूप में उपयोग करने देती है। आपको इस विधि को ओवरराइड नहीं करना चाहिए।

copy के लिए इसे पढ़ता है:

यह कक्षाएं कि NSCopying प्रोटोकॉल को अपनाने के लिए एक सुविधा विधि है। कॉपीविथज़ोन: के लिए कोई कार्यान्वयन नहीं होने पर अपवाद उठाया जाता है।

एनएसओब्जेक्ट स्वयं एनएससीपीआईपी प्रोटोकॉल का समर्थन नहीं करता है। उपclasses प्रोटोकॉल का समर्थन करना चाहिए और copyWithZone: विधि को लागू करना चाहिए। एक कॉपी विथज़ोन का सबक्लास संस्करण: विधि को पहले से ही संदेश को इसके कार्यान्वयन को शामिल करने के लिए संदेश भेजना चाहिए, जब तक कि सबक्लास सीधे NSObject से उतरता है।

कोको डिजाइन पैटर्न में उदाहरण के लिए, वे copyWithZone: और mutableCopyWithZone: ओवरराइड लेकिन जब NSCopying प्रोटोकॉल के अनुरूप copy ओवरराइड नहीं करें। क्या मुझे ऐसा करना चाहिए यदि मैं अपने कस्टम उप-वर्ग को NSDictionary में कुंजी के रूप में उपयोग करना चाहता हूं?

या क्या मैं copy ओवरराइड करता हूं?

इसी तरह, अगर मैं [myClass copy] करता हूं, तो क्या यह मेरे कस्टम सबक्लास के लिए copyWithZone: या copy पर कॉल करता है? धन्यवाद।

उत्तर

14

यह बहुत आसान है: copy का डिफ़ॉल्ट कार्यान्वयन केवल copyWithZone: को एक पूर्ण तर्क के साथ कॉल करता है। तो आपको हमेशा copyWithZone: लागू करना चाहिए। हालांकि, चूंकि आईओएस पर स्मृति क्षेत्र का उपयोग नहीं किया जाता है (जहां तक ​​मुझे पता है), आपको किसी भी धारणा के बिना क्षेत्र को अनदेखा करना चाहिए।

संपादित करें: विस्तृत करने के लिए, आप copy लागू कर सकते हैं और साथ ही, लेकिन आप copyWithZone: को लागू करना चाहिए क्योंकि आप जानते हैं जो उनमें से NSDictionary आईओएस में कॉल करेंगे कभी नहीं 6.

0

आप सुपर क्लास सुविधा का उपयोग कर रख सकते हैं विधि के रूप में, क्योंकि यह किसी भी मामले में copyWithZone: पर कॉल करने के अलावा कुछ भी नहीं करता है।

यह किसी भी सुविधा विधि के लिए सच होना चाहिए। आपको पता होना चाहिए कि वे किस विधि को कॉल करते हैं और इसके बजाय ओवरराइड करते हैं।

जैसा ऊपर बताया गया है, ज़ोन का अब उपयोग नहीं किया जाता है लेकिन विधि में अभी भी संगतता और ऐतिहासिक कारणों के लिए पैरामीटर है।