2012-02-06 12 views
20

यह उम्मीद में दो भाग प्रश्न है कि मैं विषय के बारे में समझ सकता हूं।आईओएस संपत्ति घोषणा स्पष्टीकरण

1) मुझे ऐसा लगता है आप objective c में एक वर्ग के लिए एक संपत्ति घोषित करने के लिए दो लोकप्रिय विकल्प है। एक हैडर को हेडर के क्लास बॉडी जैसे संपत्ति जोड़ना है।

@interface MyClass : NSObject { 
    NSArray *myArray; 
} 

या आप @interface शरीर के बाद और @end बयान तो की तरह से पहले ही जोड़ सकते हैं।

@interface MyClass : NSObject { 
    // 
} 

@property (nonatomic, retain) NSArray *myArray; 

इन दो "शैली" और जब आप एक दूसरे के ऊपर चुनें करते के बीच क्या अंतर है?

2) @property के बाद आपको (nonatomic, retain) जैसे विकल्प मिलते हैं। वे क्या हैं और क्यों/कब क्या आप विभिन्न विकल्पों का उपयोग करते हैं?

उत्तर

47

यहाँ केवल संपत्ति संशोधक कि Xcode पहचानता हैं:

  • nonatomic (संपत्ति पर धागा सुरक्षा लागू नहीं करता है, मुख्य रूप से उपयोग के लिए जब केवल एक धागा एक कार्यक्रम के दौरान इस्तेमाल किया जाएगा)
  • atomic (संपत्ति पर धागा सुरक्षा लागू करता है, मुख्य रूप से उपयोग जब एक से अधिक थ्रेड एक कार्यक्रम के दौरान इस्तेमाल किया जाएगा के लिए) (डिफ़ॉल्ट)
  • retain/strong (डिफ़ॉल्ट अगर एआरसी और ऑब्जेक्ट प्रकार)
  • readonly (सेट नहीं कर सकता संपत्ति)
  • readwrite (दोनों सेट और संपत्ति प्राप्त कर सकते हैं) (डिफ़ॉल्ट) (स्वचालित रूप से बरकरार रखे हुए है/सेट पर रिलीज मूल्यों, यह सुनिश्चित करें मूल्यों में अप्रत्याशित रूप से पुनःआवंटन नहीं करता है)
  • assign/unsafe_unretained (कोई स्मृति प्रबंधन इस संपत्ति के साथ किया जाएगा, यह व्यक्ति मान निर्दिष्ट करके स्वयं भी नियंत्रित किया जाता है) (डिफ़ॉल्ट नहीं तो एआरसी या ऑब्जेक्ट प्रकार)
  • copy (प्रतियां सेट करने से पहले वस्तु, में ऐसे मामलों जहां बाहरी कारकों (तार, सरणी, आदि) के कारण मूल्य सेट नहीं बदला जाना चाहिए।
  • weak (स्वचालित रूप से संदर्भ वस्तु पुनः आवंटित की जाती किया जाना चाहिए शून्य, और मूल्य में पारित बनाए रखने नहीं करता है)
  • getter=method (उपयोग किया गया चयनकर्ता सेट
  • setter= method (चयनकर्ता इस संपत्ति के मूल्य प्राप्त करने के लिए इस्तेमाल किया सेट) इस संपत्ति के मूल्य को निर्धारित करने के लिए)
+3

सवाल का यह एकमात्र जवाब के भाग 2 के लिए संरक्षित से अपने Specifier निर्धारित किया है। साइमन का जवाब भाग 1 पर चर्चा करता है। –

+0

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

+1

# 2 पूरी तरह से गलत है। 'परमाणु 'गुण * थ्रेड-सुरक्षा सुनिश्चित नहीं करते हैं; बल्कि यह परमाणुता सुनिश्चित करता है। यदि थ्रेड ए और थ्रेड बी दोनों लिख रहे हैं, तो 'परमाणु' यह सुनिश्चित करता है कि परिणाम एक संपूर्ण मूल्य होगा, जिसका अर्थ है या तो एक या दूसरे। कौन सा अपरिभाषित है। थ्रेड-सुरक्षित कोड लिखना 'परमाणु' गुणों का उपयोग करने जितना आसान नहीं है। थ्रेडिंग प्रोग्रामिंग गाइड के "सिंक्रनाइज़ेशन" अनुभाग को देखें: http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/Multithreading/ThreadSafety/ThreadSafety.html#//apple_ref/doc/uid/10000057i -CH8-SW1 –

0

पहला व्यक्ति निजी घोषणा होगी और यदि आप दूसरे को परिभाषित नहीं करते हैं तो अन्य वर्गों द्वारा पहुंचा नहीं जा सकेगा। सेकेंड का उपयोग .m मॉड्यूल में @ सिंथेसाइज के साथ किया जाता है, और कंपाइलर द्वारा आपके लिए सेटटर/गेटर का निर्माण किया जाता है। आप अभी भी अपने स्वयं के गेटर या सेटर को परिभाषित कर सकते हैं। इस मामले में @property में परिभाषित सभी iVars को अन्य वर्गों द्वारा एक्सेस किया जा सकता है। पुनः प्राप्त/रिलीज़ ऑपरेशन स्वचालित रूप से किए जाते हैं। आपको अधिक जानकारी के लिए ऐप्पल दस्तावेज़ पढ़ना चाहिए। जांचें: What's the difference between the atomic and nonatomic attributes?

28

1) @property गेटर- और सेटर-विधियों को परिभाषित करने का एक विशेष तरीका है, या जैसा कि हम उन्हें उद्देश्य-सी में एक्सेसर्स कहते हैं। आपका पहला स्निपेट सिर्फ एक सरणी घोषित करता है जिसके लिए आपको स्वयं घोषित करना और लिखना है। उदाहरण के लिए setMyArray: और myArray
@property का उपयोग करने से आपके लिए आपके एक्सेसर्स घोषित होंगे और setMyArray: और myArray घोषित करने के बराबर होगा। उद्देश्य-सी 2.0 के बाद से एक्सेसर्स घोषित करना पसंदीदा तरीका है। ध्यान दें कि आपको अभी भी संपत्ति (अपने मामले में myArray) घोषित करना है।

2) आपको सबसे पहले @ सिंथेसाइज के बारे में जानने की आवश्यकता है। याद रखें कि @property आपकी संपत्ति के लिए एक्सेसर्स को अस्वीकार करता है, @ सिंथेसिस उन्हें लागू करेगा। जब आप अपने @interface में @property का उपयोग करते हैं तो आप अधिकतर @implementation में @synthesize लिखते हैं। @ सिंथेसाइज़ का उपयोग setMyArray: और myArray को लागू करने के बराबर है।
गुण (nonatomic, retain) कंपाइलर को बताएं कि दूसरों के बीच मेमोरी प्रबंधन कैसे काम करना चाहिए और इसलिए विधियों को कैसे लागू किया जाएगा। ध्यान दें कि आप वास्तव में इन एक्सेसर्स को कभी नहीं देखते हैं, लेकिन आश्वस्त रहें कि वे वहां हैं और आपके लिए उपयोग किए जाने के लिए तैयार हैं।

उस विषय पर और पढ़ने के लिए मैं निम्नलिखित Tutorial से गुणों पर सेक्शन 9 पढ़ने की सलाह देता हूं या Book खरीदता हूं जो उद्देश्य-सी के परिचय को शामिल करता है।

इसके अलावा, आप अपने आप को कम से कम निम्न विशेषताओं वाला परिचित होना चाहिए:

  • पहुँच
    • चुनें readwrite (डिफ़ॉल्ट) या readonly। यदि readonly सेट है, तो केवल गेटर विधियां उपलब्ध होंगी।
  • सेटर मेमोरी मैनेजमेंट
    • assign (डिफ़ॉल्ट), बस नए मूल्य प्रदान करती है। आप आमतौर पर केवल प्राथमिक डेटा प्रकारों के साथ इसका उपयोग करते हैं।
    • retain, पुराना मान जारी करता है और नए को बनाए रखता है। यदि आप कचरा कलेक्टर का उपयोग करते हैं, retainassign के बराबर है। क्यूं कर? पुराने मूल्य की मैन्युअल रिलीज कचरा कलेक्टर द्वारा की जाएगी।
    • copy नए मूल्य की प्रतिलिपि बनाएँ और पुराना मान जारी करेगा। यह अक्सर तारों के साथ प्रयोग किया जाता है।
  • थ्रेडिंग
    • atomic (डिफ़ॉल्ट) यह सुनिश्चित करेंगे कि सेटर विधि परमाणु है। इसका मतलब है कि केवल एक धागा एक बार में सेटटर तक पहुंच सकता है।
    • nonatomic, जब आप धागे के साथ काम नहीं करते हैं तो इसका उपयोग करें।

This post आप स्मृति प्रबंधन और assign, retain और copy के लिए एक अच्छा परिचय देता है।

+0

@ जैक्सन क्या मैं आपको कृपया अपना जवाब स्वीकार करने के लिए कह सकता हूं? यदि यह आपको स्वीकार्य नहीं है तो कृपया मुझे बताएं कि मैं अपना उत्तर बेहतर बनाने के लिए क्या कर सकता हूं। मैं वास्तव में प्रतिष्ठा की सराहना करता हूं जो मुझे मिलेगा, धन्यवाद! – Simon

+2

हे बड, सभी ईमानदारी में मुझे लगता है कि 'रिचर्ड जे रॉस III' के पास एक गैर-पाठक के लिए एक और * संक्षिप्त * उत्तर था। हालांकि मैंने आपको +1 के रूप में रखा है क्योंकि आपने स्पष्ट रूप से * अपने उत्तर में * बहुत सारे प्रयास किए हैं। साथ ही, मैं यह पूछने में * व्यवसाय अवधारणा * देखता हूं कि मैंने आपका जवाब क्यों स्वीकार नहीं किया है, लेकिन मेरा मानना ​​है कि यह आपके जवाब को स्वीकार करने के लिए कहने के लिए * * "put-off" * है। मुझे यकीन है कि इस विषय के बारे में हर कोई * अलग * है। किसी भी तरह से मेरी दो समझ है। – Jacksonkr

2

गुण मूल रूप से एक्सेसर विधियां हैं। वे चर के दायरे को परिभाषित करते हैं। ऊपर दिए गए पहले मामले में, परिवर्तनीय अन्य वर्गों में पहुंच योग्य नहीं है जबकि दूसरे मामले में संपत्ति घोषित करके, चर अन्य वर्गों में भी पहुंच योग्य है। इसके अलावा, वे स्मृति प्रबंधन के लिए उपयोगी हैं।

+0

एक आवृत्ति चर को अन्य वर्गों के लिए 'सार्वजनिक' घोषित करके सुलभ किया जा सकता है। – newacct

0

गुण मूल रूप से एक्सेसर विधियां हैं। वे चर के दायरे को परिभाषित करते हैं। चर के डिफ़ॉल्ट पहुँच specifior द्वारा सुरक्षित है और गुण लोक

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