कहें कि आपके पास एक ऐसी विधि है जो एक नया उत्पन्न एनएसएआरएआरई उदाहरण देता है जो आंतरिक रूप से एनएसएमयूटेबलएरे के साथ बनाया गया है। आप हमेशा कुछ इस तरह करते हैं:उद्देश्य-सी में आपके रिटर्न प्रकारों के साथ आप कितने सावधान हैं?
- (NSArray *)someArray {
NSMutableArray *mutableArray = [[NSMutableArray new] autorelease];
// do stuff...
return [NSArray arrayWithArray:mutableArray]; // .. or [[mutableArray copy] autorelease]
}
या के रूप में है तो आप सिर्फ अस्थायी सरणी वस्तु छोड़ने के लिए और यह सीधे वापसी करते क्योंकि NSMutableArray NSArray का एक उपवर्ग है:
- (NSArray *)someArray {
NSMutableArray *mutableArray = [[NSMutableArray new] autorelease];
// do stuff...
return mutableArray;
}
व्यक्तिगत रूप से, मैं अक्सर जब मैं इस तरह के तरीकों से वापस आ जाता हूं तो एक म्यूटेबल सरणी को एनएसएआरएआरई में बदल दें क्योंकि मुझे लगता है कि यह किसी भी तरह से "सुरक्षित" या अधिक "सही" है। यद्यपि ईमानदार होने के बावजूद, मुझे कभी भी एक मस्तिष्क योग्य सरणी को वापस करने में कोई समस्या नहीं आई है जिसे एनएसएआरएआरई में डाला गया था, इसलिए यह वास्तव में वास्तविकता में एक गैर-मुद्दा है - लेकिन इस तरह की स्थितियों के लिए सबसे अच्छा अभ्यास है?
मैं आम तौर पर सहमत हूं। हालांकि, यदि लौटाए गए कोड के साथ कॉलिंग कोड की संभावना गंभीर समस्याएं पैदा कर सकती है, तो रक्षात्मक प्रतिलिपि एक अच्छा विचार है। यह फ्रेमवर्क कोड के लिए विशेष रूप से सच है। –
यदि कॉलिंग कोड कुछ एन्क्रिप्ट कर रहा है तो आपके एपीआई का कहना है कि इसे अपरिवर्तनीय माना जाना चाहिए, उन्हें '-मुटेबल कॉपी' करना चाहिए। अन्यथा, यह गलत कर रहा है। ;) (यदि आपको लगता है कि आपको जरूरी है तो कुछ भी आपको रक्षात्मक होने से रोक नहीं रहा है।) – Wevah
वास्तविक समस्या यह है कि यदि आप एक सरणी के लिए एक म्यूटेबल सरणी संदर्भ लौटाते हैं जिसे बाद में उत्परिवर्तित किया जा सकता है, तो कॉलर को एनएसएआरएआरई * प्राप्त हो सकता है मान लें कि सामग्री कभी नहीं बदली ... और ... अच्छा ... * बूम *। – bbum