2016-09-21 14 views
6

मैंने कई सामग्रियों को ऑनलाइन पढ़ा है जो सभी बताते हैं कि लोगों को "strong" के बजाय "copy" का उपयोग करना चाहिए।उद्देश्य-सी में "प्रतिलिपि" संपत्ति का उपयोग कैसे करें?

"कॉपी विशेषता मजबूत करने के लिए एक विकल्प है। मौजूदा ऑब्जेक्ट की स्वामित्व लेने के बजाय, यह जो कुछ भी आप संपत्ति के लिए आवंटित एक कॉपी बन जाती है, तो उस के स्वामित्व लेता है। केवल वस्तुओं है कि NSCopying प्रोटोकॉल के अनुरूप कर सकते हैं इस विशेषता का उपयोग करें ... "

और" प्रतिलिपि "का उपयोग करते समय दिखाए गए कई उदाहरण कोड हैं, मूल मान वही रहता है।

हालांकि, मैं Objective-C पर नया हूं। मैं वास्तव में जानना चाहता हूं कि नए निर्दिष्ट मूल्य का उपयोग कैसे करें। "नया मूल्य" के साथ "नया उदाहरण (प्रतिलिपि)" कहां है? यदि मैं चाहता हूं तो मूल मूल्य बदलने के लिए मुझे किसी भी अतिरिक्त तरीके की आवश्यकता है?

यह बहुत अच्छा होगा अगर कोई इस भाग के लिए कोई उदाहरण साझा नहीं कर सकता है, जो मूल मूल्य साबित नहीं करता है, जो हर जगह है।

+0

अनिवार्य रूप से, जब से तुम अब एक प्रति है, आप मूल वस्तु के लिए एक संदर्भ की जरूरत नहीं है, तो आप इसे बदल नहीं सकते। – Paulw11

+1

@ पॉलव 11 आपका क्या मतलब है "आपके पास मूल वस्तु का संदर्भ नहीं है"? मैंने मूल संदर्भ का उपयोग कर मूल मूल्य को ऑनलाइन लॉगिंग के उदाहरण ऑनलाइन पाया। क्या आप एक उदाहरण दे सकते हैं? मैं इस बारे में भी उलझन में हूं कि नया मूल्य कहां है और इसका उपयोग कैसे किया जाए। –

+5

कहें कि मेरे पास 'एनएसएसटींग * ए =" 1234 "है; 'यदि मैं' प्रति' 'संपत्ति' बी 'को' ए 'असाइन करता हूं तो सेटटर कोड प्रभावी ढंग से क्या होता है' बी = [एक प्रति] 'तो अब बी एक है नई स्ट्रिंग अगर मैं 'ए' बदलता हूं, तो 'बी' के साथ कुछ भी नहीं होगा, क्योंकि बी एक प्रति है। इसी प्रकार यदि मैं 'बी' बदलता हूं तो कुछ भी नहीं होता है। – Paulw11

उत्तर

1

कक्षा का एक उदाहरण एक अलग प्रति है। जब आप किसी वर्ग का उदाहरण copy विशेषता के साथ संपत्ति का मूल्य मानते हैं, तो उस उदाहरण का क्लोन बनाया जाता है और वह क्लोन संपत्ति का मूल्य बन जाता है। मूल और उसके क्लोन के बीच कोई संबंध नहीं है, इसलिए संपत्ति को मूल उदाहरण तक पहुंच नहीं है। संपत्ति के मूल्य की विशेषता बदलना क्लोन बदल रहा है।

नोट:

आप एक copy संपत्ति के लिए सेटर लागू करते हैं तो यह यह वास्तव में एक कॉपी बन जाती सुनिश्चित करने के लिए आपकी जिम्मेदारी है। जैसा कि किसी संपत्ति के सभी गुणों के साथ सच है, उनका मतलब केवल तब होता है जब संकलक आपके लिए सेटटर और/या गेटर उत्पन्न कर रहा है (संश्लेषित कर रहा है)।

- (void)setMyCopiedProperty:(MyClass *)newValue { 
    _myCopiedProperty = [newValue copy]; 
} 

इसका मतलब है कि जब भी किसी को इस object.myCopiedProperty = someOtherValue; की तरह कुछ करता है, someOtherValue एक copy संदेश भेजे जाने से ही नकल करने में यह कह रही:

1

क्या copy विशेषता पर्दे के पीछे करता है इस तरह एक सेटर बनाने के लिए है । रिसीवर को तब एक नया सूचक मिलता है (माना जाता है कि copy सही ढंग से लागू किया गया है), जिसके लिए रिसीवर ऑब्जेक्ट को छोड़कर कोई भी नहीं है।

  • ग्राहकों कि गुण सेट वास्तविक निर्धारित मूल्य के लिए पहुँच नहीं है
  • रिसीवर पहुँच नहीं है:

    आप जिस तरह से किसी तरह का में अनन्य होने के रूप में copy देख सकते हैं मूल पास मूल्य के लिए।

, चेतावनियां से सावधान रहें, हालांकि:

  • एक की नकल की NSArray नकल नहीं करता है यह वस्तुओं है, ताकि आप यह सोच कर कि एक @property(copy) NSArray<MyClass *> *myProperty सुरक्षित है खत्म हो सकता है, तथापि, जबकि सरणी ही किया जा रहा से सुरक्षित है संशोधित, सरणी द्वारा आयोजित वस्तुओं को एक ही संदर्भ साझा करते हैं।किसी भी संग्रह वर्ग (NSDictionary, NSSet, आदि) के लिए भी सही है
  • यदि संपत्ति कस्टम क्लास से मेल खाती है तो आपको यह सुनिश्चित करने की ज़रूरत है कि copy विधि यह काम करे - यानी एक नई वस्तु बनाना। यह सभी कोको/कोकोटाउच वर्गों के लिए सच है जो NSCopying के अनुरूप हैं, हालांकि अन्य वर्गों के लिए यह कार्यान्वयन के आधार पर यह सच हो सकता है या नहीं, (मैंने खुद को अभी तक एक वर्ग नहीं देखा है जो copy विधि के बारे में है, हालांकि आप कभी नहीं जानते)
0

इस प्रयास करें:

Model.h 

@interface Model: NSObject 

@property (nonatomic,strong)NSString *firstName; 

@property (nonatomic,copy) NSString *lastName; 

@end 

ViewController.m 

-(void)viewWillAppear:(BOOL)animated{ 
[super viewWillAppear:animated]; 
Model *model = [[Model alloc]init]; 
NSMutableString *str = [[NSMutableString alloc]initWithString:@"test"]; 
model.firstName = str; 
model.lastName = str; 
NSLog(@"%@, %@", model.firstName, model.lastName); 
[str appendString:@"string"]; 
NSLog(@"%@, %@ ", model.firstName, model.lastName);} 
+0

कृपया केवल कोड पोस्ट करने से ही आपके उत्तर की व्याख्या करें। – Sneha

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