2010-03-08 14 views

उत्तर

45

एक सामान्य सेटिंग में, किसी ऑब्जेक्ट को बनाए रखने से इसकी एक-एक करके गिनती बढ़ेगी। यह वस्तु को स्मृति में रखने में मदद करेगा और इसे उड़ाए जाने से रोक देगा। इसका अर्थ यह है कि यदि आप केवल को संस्करण बनाए रखते हैं, तो आप शेयर साझा करते हैं जो किसी भी व्यक्ति ने आपको पास कर दिया है।

किसी ऑब्जेक्ट की प्रतिलिपि बनाना, हालांकि आप इसे करते हैं, डुप्लिकेट मानों के साथ एक और ऑब्जेक्ट बनाना चाहिए। इस बारे में एक क्लोन के रूप में सोचो। आप जिस क्लोन को पास कर चुके हैं उसके साथ क्लोन साझा नहीं करते हैं।

विशेष रूप से NSString एस से निपटने पर, आप यह मानने में सक्षम नहीं होंगे कि जो भी आपको NSString दे रहा है वह वास्तव में आपको NSString दे रहा है। कोई आपको उप-वर्ग (NSMutableString, इस मामले में) सौंप सकता है जिसका अर्थ है कि वे कवर के तहत मूल्यों को संभावित रूप से संशोधित कर सकते हैं। यदि आपका आवेदन पास किए गए मान पर निर्भर करता है, और कोई इसे आपके ऊपर बदल देता है, तो आप परेशानी में भाग सकते हैं।

+15

पर काम करता है नकल यह उल्लेखनीय है कि '' 'copy' Foundation' कक्षाएं कि परिवर्तनशील नहीं हैं के अधिकांश के लिए retain' के बराबर है। – rpetrich

+0

बहुत जानकारीपूर्ण एक .. – Krishnan

+3

शायद मैं सुझाव देता हूं कि "आप ** साझा ** वह * उदाहरण * जिसे आप इसे पास कर चुके हैं," आप ** ** ** ** से * स्पष्ट * है * जिसने इसे आपको पास किया है " ? (जैसा कि हम पहले से ही कॉपी करने के बारे में बात कर रहे हैं) –

23

बनाए रखने और नकल दो अलग बातें हैं, पहली है धारणात्मक फोन-दर-संदर्भ, जबकि दूसरी कॉल-दर-मूल्य है।

3

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

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

1

प्रतिलिपि: एक नया उदाहरण बनाता है जो रिसीवर की एक प्रति है। इसका मतलब है कि आप 2 अलग

बनाए रखने होगा: बढ़ जाती है रिसीवर के retainCount। (Dealloc के साथ), जब retainCount 0.

+1

मुझे लगता है कि आपका मतलब है "dealloc'ed" (उस शब्द को क्रियान्वित करने के लिए थोड़ा अजीब), "deadlocked" नहीं – Brian

5

है अगर आप को बनाए रखने का उपयोग करें, यह मूल one.retain से सूचक मान की प्रतिलिपि भी एक एक करके संदर्भ संख्या में भी वृद्धि - एक वस्तु स्मृति से हटा दिया है। लेकिन प्रतिलिपि के मामले में, यह पॉइंटर द्वारा संदर्भित डेटा को डुप्लिकेट करता है और इसे कॉपी के इंस्टेंस वैरिएबल को असाइन करता है।

7

बनाए रखें: यह बनाई गई वस्तु पर किया जाता है, और यह केवल संदर्भ गणना को बढ़ाता है।

प्रतिलिपि - यह एक नई वस्तु बनाता है और जब नई वस्तु बनाई गई है बनाए रखने गिनती हो जाएगा 1.

आशा यू के लिए यह सहायता ... :)

0

विशेषता बनाए रखने कि इस तरह निर्दिष्ट किया जाता है यह एक और स्मृति को बनाए रख सकता है Iई इसे किसी अन्य पते पर इंगित करने के लिए भी बनाया जा सकता है प्रतिलिपि पहले पते की प्रतिलिपि बनाता है और फिर उसे बनाए रखता है।

6

इसका एक पुरानी पोस्ट लेकिन यहाँ सवाल

पर मेरे विचार है रखें 1 द्वारा एक वस्तु की गिनती बनाए रखने बढ़ जाती है और एक वस्तु का स्वामित्व लेता है।

जबकि प्रतिलिपि स्मृति स्थान में मौजूद डेटा की प्रतिलिपि बनायेगी और प्रतिलिपि को असाइन कर देगी ताकि प्रतिलिपि के मामले में आप पहले स्थान से डेटा को प्रतिलिपि बना रहे हों, इसे उस चर को असाइन करें जो बरकरार गिनती को बढ़ाता है।

बस याद रखें कि संदर्भ पर काम करता है को बनाए रखने और मूल्य

+0

बनाए रखना संदर्भ की प्रतिलिपि नहीं करता है। –

+0

क्या 'प्रतिलिपि' नई वस्तु बनाता है ?? , – Dhiru

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