2012-03-25 8 views
277

कोई विस्तार से मेरे लिए व्याख्या कर सकते हैं जब मैं प्रत्येक विशेषता का उपयोग करना होगा: nonatomic, copy, strong, weak, और इतने पर, एक घोषित संपत्ति के लिए, और समझाओ कि प्रत्येक क्या करता है? कुछ प्रकार का उदाहरण भी महान होगा। मैं एआरसी का उपयोग कर रहा हूँ।ऑब्जेक्टिव-सी घोषित @property विशेषताएं (nonatomic, कॉपी, मजबूत, कमजोर)

+0

यहां उत्तर दिया गया है http://stackoverflow.com/a/32942413/1961064 –

+0

http://rypress.com/tutorials/objective-c/properties यह बताता है कि यह सभी –

उत्तर

547

इस उत्तर में कई त्रुटियां हैं और पुरानी भी है। कृपया अन्य प्रश्न/उत्तर और टिप्पणियां देखें।


nonatomic

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

कॉपी

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

असाइन

Assign कुछ हद तक copy के विपरीत है। assign संपत्ति के गेटर को कॉल करते समय, यह वास्तविक डेटा का संदर्भ देता है। आमतौर पर आप इस विशेषता का उपयोग जब आप आदिम प्रकार की एक संपत्ति है (नाव, पूर्णांक, BOOL ...)

को बनाये रखें जब विशेषता एक वस्तु के लिए सूचक है

retain की आवश्यकता है। @synthesize द्वारा उत्पन्न सेटटर ऑब्जेक्ट को बनाए रखेगा (उर्फ एक बरकरार गिनती जोड़ें)। जब आप इसके साथ समाप्त कर लेंगे तो आपको ऑब्जेक्ट को रिलीज़ करने की आवश्यकता होगी। बनाए रखने का उपयोग करके यह गिनती गिनती को बढ़ाएगा और ऑटोरेलीज पूल में मेमोरी पर कब्जा करेगा।

मजबूत

strong बनाए रखने विशेषता के लिए एक स्थानापन्न, ऑब्जेक्टिव-सी स्वचालित संदर्भ गिनती (एआरसी) के हिस्से के रूप है। गैर-एआरसी कोड में यह बरकरार रखने के लिए सिर्फ एक पर्याय है।

यह एक अच्छा वेबसाइट आईओएस 5 के लिए http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1

कमजोर

weak सिवाय इसके कि यह 1 से संदर्भ गिनती में वृद्धि नहीं होगी strong के समान है के बारे में strong और weak सीखना है। यह उस वस्तु का मालिक नहीं बनता है बल्कि इसका संदर्भ रखता है। यदि ऑब्जेक्ट की संदर्भ संख्या 0 तक गिर जाती है, भले ही आप इसे यहां इंगित कर रहे हों, फिर भी इसे स्मृति से हटा दिया जाएगा।

उपरोक्त लिंक में वीक और स्ट्रॉन्ग के बारे में अच्छी जानकारी दोनों शामिल हैं।

+0

स्पष्टीकरण के लिए धन्यवाद, मेरे पास कुछ प्रश्न हैं, हालांकि 1. मेरे पास मेरी मुख्य डेटा क्लास है, इस कक्षा में मेरे पास मजबूत सभी सेट हैं। फिर जब मैं एक और कक्षा बना रहा हूं, तो मेरे पास टेक्स्टबॉक्स से एनएसएसटींग प्राप्त करने का वैरिएबल वैल्यू है, क्या यह एनएसएसटींग वैल्यू कमजोर प्रकार का होना चाहिए? नोब प्रश्नों के लिए खेद है अभी भी सीख रहा है ... –

+1

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

+1

आप असाइन संपत्ति खो रहे हैं। – mskw

17

यह लिंक नीचे

http://clang.llvm.org/docs/AutomaticReferenceCounting.html#ownership.spelling.property

असाइन __unsafe_unretained स्वामित्व का तात्पर्य ब्रेक है।

प्रतिलिपि __strong स्वामित्व का तात्पर्य है, साथ ही साथ सेटर पर अर्थशास्त्र के सामान्य व्यवहार का तात्पर्य है।

__strong स्वामित्व का तात्पर्य है।

मजबूत __strong स्वामित्व का तात्पर्य है।

unsafe_unretained का अर्थ है __unsafe_unretained स्वामित्व।

कमजोर __weak स्वामित्व का तात्पर्य है।

+0

असाइन संपत्ति नहीं है जो केवल iVar के लिए उपयोग की जाती है और मूल्य? तो यह असुरक्षित क्यों है और यह ध्यान देने की आवश्यकता क्यों है कि यह अप्रत्याशित है? – mskw

44

nonatomic संपत्ति है कि वस्तु सुरक्षित थ्रेड नहीं है जिसका मतलब है कि एक अलग धागा इस वस्तु से बुरी चीजें भी हो सकता है का उपयोग करने की कोशिश करता है लेकिन यह परमाणु संपत्ति की तुलना में बहुत तेजी से होता है, तो कहा गया है।

strong एआरसी के साथ प्रयोग किया जाता है और यह मूल रूप से किसी ऑब्जेक्ट की बनाए रखने की गिनती के बारे में चिंता न करने से आपकी सहायता करता है। जब आप इसके साथ काम करते हैं तो एआरसी स्वचालित रूप से आपके लिए इसे रिलीज़ करता है। कीवर्ड strong का अर्थ यह है कि आप ऑब्जेक्ट का स्वामी हैं।

weak स्वामित्व का अर्थ है कि आपके पास इसका स्वामित्व नहीं है और यह ऑब्जेक्ट का ट्रैक तब तक ट्रैक रखता है जब तक कि यह ऑब्जेक्ट को जारी नहीं किया जाता है, जैसे ही दूसरी ऑब्जेक्ट जारी होती है, यह मूल्य खो जाती है। उदाहरण के लिए। obj.a=objectB; का उपयोग किया जाता है और इसकी कमजोर संपत्ति होती है, इसकी कीमत केवल तभी मान्य होगी जब तक ऑब्जेक्ट बी स्मृति में न रहे।

copy संपत्ति बहुत अच्छी तरह से है explained here

strong,weak,retain,copy,assign ताकि आप उन्हें एक ही लक्ष्य पर उपयोग नहीं कर सकते ... "Declared Properties " अनुभाग

पढ़ उम्मीद कर इस तुम बाहर में मदद करता है एक सा परस्पर अनन्य हैं ...

+0

क्यों मजबूत, कमजोर, बनाए रखने, प्रतिलिपि, पारस्परिक रूप से अनन्य –

+0

'nonatomic' असाइन करने का मतलब है कि कोई बहिष्करण लागू नहीं किया गया है। इसका मतलब यह नहीं है कि एक्सेस थ्रेड सुरक्षित नहीं है। यह एक कार्यान्वयन विस्तार है कि 'परमाणु' बनाम 'nonatomic' कब्जा नहीं करता है। – bbum

+0

@bbum क्या आप कोई बहिष्करण और थ्रेड सुरक्षित नहीं के बीच अंतर समझा सकते हैं ..? –

9

शानदार उत्तर! एक चीज जिसे मैं गहराई से स्पष्ट करना चाहता हूं nonatomic/atomic है। उपयोगकर्ता को यह समझना चाहिए कि यह संपत्ति - "परमाणु" केवल विशेषता के संदर्भ पर फैली हुई है, न कि इसकी सामग्री पर। आईई। atomic पॉइंटर को पढ़ने/सेट करने और विशेषता के लिए केवल सूचक के लिए उपयोगकर्ता परमाणु की गारंटी देगा। उदाहरण के लिए:

@interface MyClass: NSObject 
@property (atomic, strong) NSDictionary *dict; 
... 

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

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

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