2015-07-04 6 views
8

मैं आईओएस में नया हूं और मैं जानना चाहता हूं कि जब हमें किसी संपत्ति में copy का उपयोग करना चाहिए, उदा।कॉपी बनाम मजबूत गुण

@property (nonatomic, retain) NSString* name; 

बनाम

@property (nonatomic, copy) NSString* name;` 

retain और copy बीच क्या अंतर है, और मैं एक दूसरे के लिए नहीं इस्तेमाल करना चाहिए जब?

+0

आम तौर पर, मैं एनएसएसटींग, सरणी और अन्य चर जैसी वस्तुओं के लिए बनाए रखने का उपयोग करता हूं। लेकिन जब मैं UIView के आउटलेट ले रहा हूं, या UIViewController के रूप में कोई भी उदाहरण ले रहा हूं, तो मैं मजबूत हूं। अन्यथा वास्तव में मुझे अंतर नहीं पता है। –

+4

@ArpitParekh strong === बरकरार रखें: http://stackoverflow.com/questions/7796476/property-definitions-with-arc-strong-or-retain – DanZimm

+0

लेकिन, जब मैं एक चर के रूप में UIViewController ले रहा हूं, और मुझे इसकी आवश्यकता है इसे एक मजबूत उचित के रूप में असाइन करें, अगर मैं इसे बरकरार रखता हूं तो मेरा ऐप दुर्घटनाग्रस्त हो जाता है ... यह लिंक इसका समर्थन करता है। इसे सबव्यूव के रूप में जोड़ते समय http://stackoverflow.com/questions/9144959/how-to-retain-view-after-addsubview-of-uiviewcontroller-with-arc –

उत्तर

3

यदि NSStringmutable है तो यह copied हो जाता है। यदि ऐसा नहीं है, तो यह retained यदि आप copy का उपयोग करेंगे, तो स्ट्रिंग के लिए एक नई प्रतिलिपि बनाई जाएगी इसलिए अलग-अलग स्मृति पता भी बनाया जाएगा। हालांकि, यदि आप retain का उपयोग करेंगे तो यह उसी स्मृति पते में होगा, केवल काउंटर बदल जाएगा। के रूप में NSString अपरिवर्तनीय है और यह बच्चे वर्ग NSMutableString परिवर्तनशील है

+0

आपका मतलब है कि जब संपत्ति में एनएसएसटींग संपत्ति है तो मैं बनाए रखने का उपयोग करता हूं और जब मैं एनएसएमयूटेबलस्ट्रिंग का उपयोग कर रहा हूं तो मुझे सही विकल्प का उपयोग करने की आवश्यकता है? –

+0

एनएसएसटींग कभी भी परिवर्तनीय नहीं है। इसलिए एनएसएमयूटेबलस्ट्रिंग की आवश्यकता ... – DanZimm

9
@property (nonatomic, copy) NSString* name; 

, बेहतर है।

जब तक आप NSString का उपयोग कर रहे हैं, तो आप कोई अंतर नहीं देखेंगे। लेकिन जब आप NSMutableString का उपयोग शुरू करते हैं, तो चीजें थोड़ा पासा हो सकती हैं।

NSMutableString *department = [[NSMutableString alloc] initWithString:@"Maths"]; 

Person *p1 = [Person new]; 
p1.department = department; 

//Here If I play with department then it's not going to affect p1 as the property was copy 
//e.g. 
[department appendString:@"You're in English dept."]; 

था यह सिर्फ बनाए रखने की गई यह p1 विभाग बदल जाता। इसलिए इस मामले में कॉपी की प्रतिलिपि बनाई गई है।

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