ऑब्जेक्टिव-सी घोषित की गई @property विशेषताएँ (गैर-परमाणु, प्रतिलिपि, मजबूत, कमजोर)


289

किसी को विस्तार से मेरे लिए व्याख्या कर सकते हैं जब मैं प्रत्येक विशेषता का उपयोग करना होगा: nonatomic, copy, strong, weak, और पर हां, एक घोषित संपत्ति के लिए करें और बताएं कि प्रत्येक क्या करता है? उदाहरण के कुछ प्रकार भी महान होगा। मैं एआरसी का उपयोग कर रहा हूं।



जवाबों:


559

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


nonatomic

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

प्रतिलिपि

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

असाइन

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

को बनाये रखें

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

बलवान

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

IOS 5 के बारे में strongऔर जानने के लिए यह एक अच्छी वेबसाइट है weakhttp://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1

कमज़ोर

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

उपरोक्त लिंक में कमजोर और मजबूत दोनों के बारे में अच्छी जानकारी है


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

1
आपको असाइन की गई संपत्ति याद आ रही है।
mskw

10
nonatomicइसका मतलब है कि इसे कई धागों से समवर्ती रूप से नहीं जाना चाहिए । डिफ़ॉल्ट वह है atomicजो इसे थ्रेड सुरक्षित बनाता है।
wcochran

1
यह थोड़ा परेशान करने वाला है कि इस समय के बाद गैर-परमाणु की परिभाषा अभी भी गलत है, और परमाणु जैसा दिखता है। मुझे आश्चर्य है कि पिछले पांच वर्षों में कितने लोगों ने इसका उपयोग किया है और गलत प्रभाव डाला है। @Wcochran ने जो कहा वह सही था। नॉनटोमिक का मतलब है कि पॉइंटर तक पहुंच को परमाणु रूप से नियंत्रित नहीं किया जाता है, और इसलिए थ्रेड सुरक्षित नहीं है। गैर-परमाणु के रूप में मुझे यह समझने में लाभ यह है कि यह हल्का वजन है।
जॉन बुशनेल

1
@JohnBushnell की टिप्पणी के अलावा इस उत्तर में कई अन्य त्रुटियां और गलतियां हैं। यह भी अच्छी तरह से वृद्ध नहीं हुआ है, इसलिए सोमवत ऐतिहासिक है। यदि आप इस प्रश्न का उत्तर चाहते हैं, तो अन्यत्र देखें।
CRD

45

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

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

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

copyसंपत्ति यहाँ बहुत अच्छी तरह से समझाया गया है

strong,weak,retain,copy,assignपरस्पर अनन्य हैं इसलिए आप उन्हें एक ही वस्तु पर उपयोग नहीं कर सकते हैं ... "घोषित गुण" खंड पढ़ें

यह उम्मीद है कि आप थोड़ा मदद करता है ...


क्यों मजबूत, कमजोर, बनाए रखने, कॉपी, पारस्परिक रूप से अनन्य असाइन करें
vinoth.kumar

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

@bbum क्या आप किसी अपवर्जन और न थ्रेड सेफ के बीच अंतर समझा सकते हैं ..?
अंकित श्रीवास्तव

1
@AnkitSrivastava का बहिष्करण तब होता है जब थ्रेड A एक कोड पथ से नीचे जाने से थ्रेड B ब्लॉक करता है। यदि वह कोड पथ कई थ्रेड से निष्पादन के लिए सुरक्षित है, तो बहिष्करण आवश्यक नहीं है। थ्रेड सेफ का मतलब कोड का रास्ता अपरिभाषित परिणाम दे सकता है यदि ए और बी समवर्ती रूप से नीचे जाते हैं। यह है कि बहिष्करण का उपयोग कुछ थ्रेड को सुरक्षित बनाने के लिए किया जा सकता है, लेकिन थ्रेड सुरक्षा के लिए अनन्य - गैर-समवर्ती - निष्पादन की आवश्यकता नहीं होती है।
bbum

17

इस लिंक का ब्रेक डाउन है

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

तात्पर्य __unsafe_unretain स्वामित्व से है।

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

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

मजबूत का मतलब है __strong स्वामित्व।

असुरक्षित_अनुरक्षित तात्पर्य __unsafe_unretain स्वामित्व है।

कमजोर का मतलब है __weak स्वामित्व।


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

9

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

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

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.