2012-09-12 17 views
9

उद्देश्य-सी में गुणों की घोषणा करते समय, कॉन्फ़िगर करने के लिए कस्टम विकल्प क्या उपलब्ध हैं, जो परिभाषित करते हैं कि एक्सेसर विधियों का व्यवहार कैसे होगा?उद्देश्य-सी गुणों के प्रकार

उदाहरण के लिए, आप कमजोर, मजबूत, केवल पढ़ सकते हैं।

परमाणु बनाम nonatomic मुख्य रूप से सुनिश्चित करता है कि पूरा मान संश्लेषित ही टिककर खेल से लौटे हैं और यह कि पूरा मान संश्लेषित setters द्वारा लिखे जाते हैं:

+2

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html – sosborn

+0

@ सोसबोर्न ताकि आप कोमा द्वारा अलग किए गए कोष्ठक के भीतर एकाधिक विकल्प हो सकें? – makaed

+0

@makaed हां, लेकिन केवल एक जो मेमोरी प्रबंधन से संबंधित है –

उत्तर

39

यहाँ संक्षिप्त उत्तर है।

रीडराइट बनाम पाठक यह निर्धारित करता है कि संश्लेषित संपत्ति में एक संश्लेषित एक्सेसर है या नहीं (रीडराइट में एक सेटर है और डिफ़ॉल्ट है, केवल पढ़ा नहीं जाता है)।

असाइन बनाम कमजोर बनाम बनाम बनाम प्रतिलिपि निर्धारित करता है कि संश्लेषित एक्सेसर्स उद्देश्य-सी मेमोरी प्रबंधन योजना के साथ कैसे सहभागिता करते हैं।

और अब लंबे समय तक उत्तर के लिए:

परमाणु वी nonatomic

यह मानते हुए कि आप विधि कार्यान्वयन @synthesizing कर रहे हैं, परमाणु बनाम गैर-परमाणु परिवर्तन उत्पन्न कोड। यदि आप अपना खुद का सेटर/गेटर्स लिख रहे हैं, परमाणु/nonatomic/retain/असाइन/कॉपी केवल सलाहकार हैं।

परमाणु के साथ, संश्लेषित सेटटर/गेटर यह सुनिश्चित करेगा कि किसी भी अन्य थ्रेड पर सेटटर गतिविधि के बावजूद, एक पूर्ण मूल्य हमेशा गेटटर से या सेटटर द्वारा सेट किया जाता है। यही है, अगर थ्रेड ए गेटटर के बीच में है, तो थ्रेड बी सेटटर को कॉल करता है, एक वास्तविक व्यवहार्य मूल्य - एक ऑटोरेलेज्ड ऑब्जेक्ट, सबसे अधिक संभावना - ए

में कॉलर को वापस कर दिया जाएगा nonatomic में, ऐसी कोई गारंटी नहीं दी जाती है। इस प्रकार, परमाणु से nonatomic काफी तेज है।

क्या परमाणु नहीं करता है थ्रेड सुरक्षा के बारे में कोई गारंटी देता है। यदि थ्रेड ए थ्रेड बी और सी के साथ एक साथ गेटर को अलग-अलग मानों के साथ बुला रहा है, तो थ्रेड ए को वापस दिए गए तीन मानों में से कोई एक प्राप्त हो सकता है - किसी भी सेटर्स से पहले या सेटर्स में पास किए गए मानों में से एक बी और सी में इसी तरह, वस्तु बी या सी के मूल्य के साथ समाप्त हो सकती है, बताने का कोई तरीका नहीं है।

डेटा अखंडता सुनिश्चित करना - बहु-थ्रेडेड प्रोग्रामिंग की प्राथमिक चुनौतियों में से एक - अन्य माध्यमों द्वारा हासिल किया जाता है।

असाइन, कमजोर, बनाए रखने, कॉपी

संक्षेप में, बनाम कमजोर आवंटित बनाम बनाए रखने बनाम प्रति निर्धारित करता है कि संश्लेषित accessors ऑब्जेक्टिव-सी स्मृति प्रबंधन योजना के साथ बातचीत:

  • असाइन डिफ़ॉल्ट है और बस एक चर असाइनमेंट करता है। यह स्वामित्व का दावा नहीं करता है, इसलिए संपत्ति के सूचक द्वारा इंगित ऑब्जेक्ट किसी भी समय गायब हो सकता है अगर किसी अन्य ने बनाए रखने या अन्य माध्यमों के माध्यम से खुद को स्वामित्व नहीं दिया है। एआरसी पर्यावरण में, असाइन यह सुनिश्चित नहीं करता है कि पॉइंटर्स लटक नहीं पाएंगे, जिसका अर्थ है कि एक पॉइंटर जंक को इंगित कर सकता है यदि दूसरी तरफ ऑब्जेक्ट को हटा दिया गया हो।
  • कमजोर असाइन करने के समान है, सिवाय इसके कि यह पॉइंटर्स को शून्य कर देगा जो उन्हें हटाए जाने से रोकने के लिए हटाए गए ऑब्जेक्ट्स को ले जाते हैं। कमजोर केवल एआरसी पर्यावरण में उपलब्ध है।
  • बरकरार रखता है कि नया मान भेजा जाना चाहिए - असाइनमेंट पर पुराना और पुराना मूल्य भेजा गया रिलीज। बनाए रखना भी मजबूत के रूप में जाना जाता है।
  • प्रतिलिपि निर्दिष्ट करती है कि नया मान भेजा जाना चाहिए-असाइनमेंट पर कॉपी करें और पुरानी मान प्रेषित रिलीज। प्रतिलिपि अक्सर उन गुणों के लिए उपयोग की जाती है जिनमें संपत्ति के प्रकार में एक परिवर्तनीय चचेरे भाई (एनएसएआरआरई/एनएसएमयूटेबलएरे) होता है ताकि दूसरों को उत्परिवर्तनीय संस्करणों में भेजने और उन्हें बदलने/उन्हें अपनी पीठ के पीछे बदलकर रोकने में मदद मिल सके।

याद रखें कि बनाए गए ऑब्जेक्ट पर बनाए/मजबूत किया जाता है (यह संदर्भ गणना को बढ़ाता है) जबकि प्रतिलिपि एक नई वस्तु बनाती है। तो अंतर यह है कि क्या आप ऑब्जेक्ट में एक और बनाए रखना चाहते हैं या पूरी तरह से नई ऑब्जेक्ट बनाना चाहते हैं।

+0

रीडराइट बनाम रीडोनली एक गेटर/सेटर को संश्लेषित होने से रोकने के लिए _just_ नहीं करता है। यह दूसरों को कोशिश करने पर कैंडी जैसे त्रुटियों को सौंपकर मूल्य तक पहुंचने से रोकता है। _weak_ भी भूल गया, जो शून्य बिंदु उन्हें खतरे से रोकने के लिए इंगित करता है। मुझे लगता है कि आप _strong_ के बजाय _retain_ के उपयोग से एआरसी के बारे में सोच नहीं रहे थे। – Metabble

+0

@ मेटाबबल यदि मैं आपको सही तरीके से समझता हूं, तो आपने मेरा जवाब वोट दिया है क्योंकि यह गलत या अनुपयोगी है, लेकिन क्योंकि मैं आलसी, अनिश्चित प्रश्न का व्यापक उत्तर नहीं देता हूं? इसके अलावा, मेरे जवाब को संपादित करने या "अंतराल को भरने" के लिए अपना जवाब जोड़ने के बजाय, आपने मेरी ओवरसीट को इंगित करने वाली एक स्नैकी टिप्पणी छोड़ दी है। खैर, मुझे याद दिलाने के लिए धन्यवाद कि मैंने इस साइट में भाग क्यों बंद कर दिया। मुझे आशा है कि जब आप एक और छः महीनों में फिर से भूल जाएंगे तो आप यहां मदद करने के लिए आएंगे। – PengOne

+0

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

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