2010-11-03 12 views
14

मैं इस बारे में उलझन में हूं कि किसके उपयोग और कब उपयोग करना है। क्या अंगूठे का नियम है? क्या ज्यादातर मामलों में उनमें से कोई भी इस्तेमाल किया जा सकता है? कोई विशेष नियम?जब उपयोग करना है और प्रतिलिपि का उपयोग कब करें

@property (nonatomic, retain) NSDate *theDateFromPicker; 
@property (nonatomic, copy) NSDate *theDateFromPicker; 

इस मामले में सबसे अच्छा विकल्प कौन सा होगा?

धन्यवाद -Code

उत्तर

14

जब आप किसी अन्य ऑब्जेक्ट द्वारा ऑब्जेक्ट को संशोधित करने की संभावना नहीं चाहते हैं तो आप प्रतिलिपि का उपयोग करना चाहेंगे।

एक अच्छा उदाहरण NSString है। मान लीजिए कि आप इस कोड को करते हैं:

@property (nonatomic, retain) NSString *aString; 

// in some other class 

NSMutableString *mutableString = [[NSMutableString alloc] initWithString:@"test"]; 
theObject.aString = mutableString; // theObject retains the mutable string 

[mutableString setString:@"test2"]; 

यहाँ क्या होता है कि आप aString के लिए मूल्य "परीक्षण" आवंटित है, लेकिन फिर इसे बाहर से संशोधित हो जाता है और यह, "test2" हो जाता है क्योंकि आप परिवर्तनशील स्ट्रिंग बनाए रखा । यदि आपने copy सेट किया था, तो ऐसा नहीं होगा, क्योंकि आप म्यूटेबल स्ट्रिंग के कॉपी कर रहे हैं।

1
साथ

कॉपी आप 2 अलग-अलग वस्तुओं होगा। तो यदि आप एक को संशोधित करते हैं, तो दूसरा संशोधित नहीं किया जाएगा।

1

कॉपी आपको एक अलग वस्तु देता है।

आम तौर पर, आपको केवल तब तक बनाए रखना चाहिए जब तक कि आप स्पष्ट रूप से वस्तुओं की प्रतियां बनाना नहीं चाहते हैं। प्रत्येक बार जब आप कॉपी करते हैं तो आपको रिलीज़ करना होता है, इसलिए इसे ध्यान में रखें।

उपयोग करने के लिए एक अच्छा समय -कोपी तब होती है जब आप वस्तुओं को जोड़ने या निकालने के लिए गणना का उपयोग करने जा रहे हैं।

उदाहरण के लिए, एक सरणी लें। यदि आप सरणी की गणना कर रहे हैं, तो आप गणना के दौरान वस्तुओं को जोड़ या निकाल नहीं सकते हैं, या आप क्रैश हो जाएंगे। गणना शुरू करने से पहले, सरणी की एक नई प्रतिलिपि बनाने के लिए -पीपी का उपयोग करें, और जैसा कि आप गणना कर रहे हैं, अगर आपको ऑब्जेक्ट (म्यूटेट) जोड़ने/निकालने की आवश्यकता है, तो आप प्रतिलिपि पर ऐसा कर सकते हैं।

जब आप गणना के साथ समाप्त हो जाते हैं तो आप कॉपी को मूल पर वापस सेट कर सकते हैं।

9

एनएसडीएटी अपरिवर्तनीय है और हमारे पास इस समय एक परिवर्तनीय सबक्लास नहीं है। तो ठीक है बरकरार है। प्रतिलिपि या तो चोट नहीं पहुंचाएगी, और वास्तव में मैं प्रतिलिपि को यहां एक ही उदाहरण को वापस करने की उम्मीद करता हूं (एक बार फिर बनाए रखा)।

एनएसएसटींग पर प्रति का उपयोग करने का कारण यह है कि आपको अपने ऑब्जेक्ट में एनएसएमयूटेबलस्ट्रिंग पास हो सकती है, जो आपके पैरों के नीचे सही हो सकती है। यह यहाँ नहीं हो सकता है।

3

आईओएस में, आप आमतौर पर एकल धागे के साथ काम करेंगे, इसलिए कोई संभावना नहीं है कि आपकी वस्तु एक साथ संशोधित हो। इसके अलावा यदि आप copy निर्दिष्ट करते हैं तो भी संपत्ति को फिर से सेट करके संशोधित किया जा सकता है।

अंगूठे का नियम है: "iOS पर retain का उपयोग करें"

हालांकि कुछ स्थितियों कि प्रति का उपयोग कर की आवश्यकता है देखते हैं/सलाह दी:

  • आप चाहिए उपयोग प्रति आप स्वीकार करता है, तो ब्लॉक (आईओएस 4 के साथ कोड के ब्लॉक जोड़े गए) क्योंकि ब्लॉक को बनाए रखने से पहले ढेर में कॉपी करने की आवश्यकता है (अधिक जानकारी के लिए Copying blocks (ie: copying them to instance variables) in Objective-C देखें
  • यदि आप कोड लिखते हैं जो बैकग्राउ में निष्पादित किया जाएगा और यह उपयोग करने के लिए सुरक्षित है (परमाणु, प्रतिलिपि)।
  • आपको कॉपी का उपयोग करने पर विचार करना चाहिए यदि आप यह सुनिश्चित करना चाहते हैं कि केवल संपत्ति को असाइन करना ही मूल्य को बदलता है। (अगर आप KVO लागू उपयोगी हो सकता है)
3

अंगूठे का नियम copy का उपयोग वर्ग NSCopying प्रोटोकॉल लागू करता है, तो जब तक आप अच्छा कारण नहीं करने के लिए है है। एकमात्र अच्छा कारण मैं सोच सकता हूं प्रदर्शन है। उदाहरण के लिए, तकनीकी रूप से आपको copyNSMutableArray गुणों के लिए उपयोग करना चाहिए, लेकिन जैसा कि आप कल्पना कर सकते हैं, बड़े म्यूटेबल सरणी की प्रतिलिपि CPU समय और स्मृति में महंगा हो जाएगी।

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