2010-03-12 7 views
14

मैं सोच रहा था कि मुझे प्रतिलिपि बनाई गई NSObject जारी करने की आवश्यकता है या नहीं? उदाहरण के लिए, मैं केवल एक शब्दकोश है कि मैं एक सरणी में कॉपी बनाएं:क्या मुझे प्रतिलिपि बनाई गई NSObjects को छोड़ने की आवश्यकता है - उद्देश्य-सी

कोड:

for (int num = 0; num < [object count]; num++) { 
    [dictionary setObject:[object objectAtIndex:num] forKey:@"x"]; 
    [array addObject:[dictionary copy]]; 
} 

मैं शब्दकोश जारी करने के लिए है? यदि हां, तो कब?

धन्यवाद

+0

+1 अच्छा प्रश्न – andy

+3

अंगूठे के नियम के रूप में, कोको में आपको अपनी कुछ भी रिलीज़ करना होगा। यदि आप इसे नए, प्रतिलिपि, आवंटित या बनाए रखने के साथ संदेश भेजते हैं तो आपके पास कुछ है। यदि आपने उन तरीकों में से किसी एक को कॉल नहीं किया है, तो आपके पास इसका स्वामित्व नहीं है और आपको इसे जारी नहीं करना चाहिए। –

उत्तर

24

हाँ, आप करते हैं। इस मामले में, आप शायद प्रतिलिपि तुरंत सरणी में जोड़ने के बाद, जारी करना चाहिए, क्योंकि सरणी कुछ भी यह करने के लिए जोड़ा बरकरार रखती है:

NSDictionary *copied = [dictionary copy]; 
[array addObject:copied]; 
[copied release]; 
+0

जानकारी के लिए धन्यवाद! – ncohen

4

दस्तावेज़ से यह टुकड़ा:

- (आईडी) कॉपी

रिटर्न वैल्यू एनएससीपीआईपी प्रोटोकॉल विधि प्रतिलिपि द्वारा वापस ऑब्जेक्ट प्रतिलिपि विजिज़ोन: जहां ज़ोन शून्य है।

चर्चा एनएससीपीआईपी प्रोटोकॉल को अपनाने वाले वर्गों के लिए यह एक सुविधाजनक तरीका है। CopyWithZone के लिए कोई कार्यान्वयन नहीं होने पर एक अपवाद उठाया जाता है:।

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

विशेष विचार यदि आप प्रबंधित स्मृति (कचरा संग्रह नहीं) का उपयोग कर रहे हैं, तो यह विधि इसे वापस करने से पहले नई वस्तु को बरकरार रखती है। विधि का आवेदक, लौटा ऑब्जेक्ट जारी करने के लिए ज़िम्मेदार है।

2

copy के साथ, आप लौटे ऑब्जेक्ट का स्वामित्व लेते हैं। कंटेनर भी उन वस्तुओं में स्वामित्व लेते हैं।
नतीजतन, आपको प्रतिलिपि के स्वामित्व को छोड़ना होगा क्योंकि नोहा ने बताया था। Cocoa memory management guidelines में how to work with containers पर एक अनुभाग शामिल है।

0

यह कहना मुश्किल है कि आप कहां शब्दकोश बनाते हैं, चाहे यह समझदार हो। शब्दकोश में कोई अन्य सदस्य हैं, तो, यह होगा सरल (हालांकि यकीनन कठिन पढ़ने के लिए :) की तरह कुछ करने के लिए

for (int num = 0; num < [object count]; num++) { 
    [array addObject:[NSDictionary 
          dictionaryWithObject:[object objectAtIndex:num] 
             forKey:@"x" 
        ] 
    ] 
} 

Thats अपने सरणी में आप असली NSDictionary वस्तुओं देने जा रहा है, बल्कि NSMutableDictionary से प्रतियां जो आप बना रहे हैं।

+0

आप किस आधार पर दावा करते हैं कि एनएसएमयूटेबल डिक्शनरी की एक प्रति "* असली * NSDictionary" नहीं होगी? –

+0

यदि आप वस्तुओं को सम्मिलित करने का प्रयास करते हैं तो एक * असली * NSDictionary त्रुटियों को फेंक देगा। – Jeff

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