2012-03-14 15 views
22

संभव डुप्लिकेट:
Is there a difference between an “instance variable” and a “property” in Objective-c?
Difference between self.ivar and ivar?आईओएस हेडर फ़ाइल में गुणों और चर के बीच अंतर?

तुरंत @interface पंक्ति के बाद कोष्ठक में चर घोषित करने, और नीचे गुण को परिभाषित करने के बीच क्या अंतर है?

उदाहरण के लिए ...

@interface GCTurnBasedMatchHelper : NSObject { 
BOOL gameCenterAvailable; 
BOOL userAuthenticated; 
} 

@property (assign, readonly) BOOL gameCenterAvailable; 

उत्तर

22

कोष्ठक में चर को परिभाषित करना बस उन्हें उदाहरण चर की घोषणा की।

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

ब्रैकेट में एक ivar घोषित करना और फिर एक संबंधित संपत्ति (जैसा कि आपके उदाहरण में) घोषित करना बहुत आम है, लेकिन यह कड़ाई से जरूरी नहीं है। संपत्ति को परिभाषित करना और संश्लेषण करना आवश्यक है, क्योंकि संपत्ति को संश्लेषित करना भी एक ivar बनाता है।

दृष्टिकोण वर्तमान में एप्पल (टेम्पलेट्स में) ने सुझाव दिया है:

हेडर फाइल में संपत्ति को परिभाषित करें, जैसे:

@synthesize gameCenter = __gameCenter; 

:

@property (assign, readonly) gameCenter; 

फिर कार्यान्वयन में & घोषित इवर संश्लेषण अंतिम पंक्ति gameCenter संपत्ति को संश्लेषित करती है और दावा करती है कि संपत्ति को जो भी मूल्य सौंपा गया है, उसे संग्रहीत किया जाएगा __gameCenter इवर। दोबारा, यह जरूरी नहीं है, लेकिन सिंथेसाइज़र के बगल में ivar को परिभाषित करके, आप उन स्थानों को कम कर रहे हैं जहां आपको अभी भी नामकरण के दौरान ivar का नाम टाइप करना होगा।

+0

पढ़ने एक संपत्ति की घोषणा से आसानी से पढ़ सकते हैं (नहीं किया है 'परिभाषित', वैसे - गुण उद्देश्य-सी में परिभाषित नहीं किया जा सकता है) एक गेटर और/या सेटर विधि घोषित करता है, लेकिन * * * एक्सेसर विधियों को उत्पन्न नहीं करता है। एक्सेसर विधियों को संश्लेषित किया जाता है यदि कार्यान्वयन में संबंधित '@ संश्लेषण' होता है, जो वैकल्पिक है। साथ ही, यह शायद उल्लेखनीय है कि घुंघराले ब्रेसिज़ के अंदर घोषित चर को * आवृत्ति चर * के रूप में जाना जाता है। – jlehr

+0

विस्तार के बिंदुओं पर: हाँ, यह @ सिंथेसाइज़ है जो वास्तव में एक्सेसर्स उत्पन्न करता है। हां, आप गुणों को "घोषित" करते हैं (और फिर कंस्ट्रैसिस में उनके व्यवहार को परिभाषित करते हैं)। प्रश्न के दायरे को देखते हुए, मुझे लगता है कि यह मानना ​​उचित है कि हम जानते हैं कि "चर" एक आवृत्ति चर को संदर्भित करता है (उत्तर बार-बार "ivar" का उपयोग करता है)। – isaac

+1

आगे विस्तार: ओबीजेसी एक डिजाइन रणनीति के रूप में encapsulation को बढ़ावा देता है। अन्य वर्गों को किसी ऑब्जेक्ट की आंतरिक स्थिति से सीधे गड़बड़ नहीं करनी चाहिए (वास्तव में, इन दिनों इसे आपकी कक्षा 'हेडर फ़ाइल में यथासंभव कुछ कार्यान्वयन विवरण दिखाने के लिए सबसे अच्छा देखा जाता है)। इसके बजाय, वे अपने घोषित गुणों तक पहुंचने के लिए गेटटर/सेटर विधियों (जैसे स्वचालित रूप से @ संपत्ति/@ संश्लेषण वाक्यविन्यास द्वारा बनाए गए) का उपयोग कर सकते हैं। यह ऑब्जेक्ट को मान वापस करने के लिए अनुरोधों पर प्रतिक्रिया करने की अनुमति देता है (कहें, आलसी लोड करके) या एक नया मान सेट करने के लिए (कहें, कुछ संबंधित UI को अपडेट करके)। – rickster

1

जब आप किसी संपत्ति को परिभाषित करते हैं तो आपके लिए गेटटर और सेटर बनाया जाता है। जब आप उन्हें object.member सेटर्स का उपयोग करके एक्सेस करते हैं और गेटर्स स्वचालित रूप से कॉल होते हैं।

जब आप इंटरफ़ेस सेटर्स में चर घोषित करते हैं और गेटर्स आपके लिए नहीं लिखे जाते हैं। तुम भी, जैसे निजी @ उन्हें कुछ दृश्यता संशोधक निर्दिष्ट @ सार्वजनिक आदि कर सकते हैं

14
{ 
BOOL gameCenterAvailable; 
BOOL userAuthenticated; 
} 

उपरोक्त दो सदस्य चर वे कक्षा के बाहर पहुँचा नहीं जा सकता। (महत्वपूर्ण बिंदु) (जब तक कहा जाता है आप कस्टम गेटर्स और सेटर्स प्रदान करते हैं)

यदि आप @property बनाते हैं तो चर वर्ग के साथ-साथ कक्षा के बाहर भी पढ़ा जा सकता है .. इसलिए सेटर्स और गेटर्स आपके लिए जेनरेट किए जाते हैं ..स्वचालित रूप से

फिर उसी की घोषणा एक सदस्य चर के रूप में की आवश्यकता नहीं है ..

यह सिर्फ पठनीयता को बढ़ाने के लिए .. आप इसे

@property (non..) 
+3

यह सिर्फ पठनीयता नहीं है, इसे स्मृति प्रबंधन रणनीति का एक महत्वपूर्ण घटक भी माना जाता है। – isaac

+0

मुझे लगता है कि हम इसे @public जैसे दृश्यता संशोधक का उपयोग करके कर सकते हैं। – Vignesh

+0

हाँ .. आप सही हैं .. फिर भी मैं उस स्मृति रणनीति का इतना विवरण नहीं जोड़ सकता .. इसलिए मैं आपको सिर्फ +1 कर दूंगा .. – Shubhank

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