यदि मैं @property (बनाए रखना) कुछ * myVar का उपयोग करता हूं; मैं self.myVar के साथ उस चर का उपयोग कर सकता हूं ... लेकिन, क्या अंतर है?
@property (retain) Something *myVar;
// this property declaration declares:
- (Something *)myVar;
// and
- (void)setMyIvar:(Something *)arg;
// and is accessible by dot syntax.
// it also declares and/or documents how the ivar is managed (copy, retain, etc.)
उपयोग में
:
// direct access to the ivar. zero additional overhead (with regard to accessing the ivar)
[myVar message];
// properties used with dot syntax invoke the accessor. therefore,
[self.myVar message];
// is the same as:
[[self myVar] message];
संपत्ति के गुण भी कैसे एक्सेसर के संश्लेषण के लिए के रूप में संकलक को निर्देश देने के।
क्या कोई अच्छा कारण है कि मुझे एक विधि या किसी अन्य का उपयोग करना चाहिए?
init और dealloc में, सीधे ivar तक पहुंचें - आप ऑब्जेक्ट के इवर की शुरुआत और सफाई में रुचि रखते हैं और उप-वर्गों की परवाह नहीं करते हैं। यहां गुणों का उपयोग करने से बग या अपरिभाषित व्यवहार भी शुरू हो सकता है।
अन्य मामलों के लिए, यानी, जब ऑब्जेक्ट पूरी तरह से निर्मित राज्य में होता है, तो आपको हमेशा स्थिरता के लिए एक्सेसर का उपयोग करना चाहिए।यदि एक सबक्लास एक एक्सेसर को ओवरराइड करता है, तो इवर की सीधी पहुंच डिज़ाइन तोड़ सकती है।
यदि आप इससे बचना चाहते हैं, तो ivar निजी बनाएं और इसके लिए कोई संपत्ति घोषित न करें। यदि आप इसके लिए एक संपत्ति घोषित करते हैं, तो दस्तावेज कि यह निजी है; मैं आमतौर पर इस मामले में @property (retain) Something * private_myIvar;
लिखूंगा। इस मामले में, ivar के स्मृति प्रबंधन को synthseize करने के लिए एक संपत्ति का उपयोग करना सुविधाजनक है।
जब इवर निजी है, तो आपके पास इसकी कुल पहुंच है। सीधे या निजी संपत्ति तक पहुंच सुरक्षित है। अन्यथा, मान लीजिए कि आपको एक्सेसर का उपयोग करना होगा।
यदि myIvar निजी घोषित किया गया है और केवल प्रारंभ में ही बनाया जाएगा, तो आप संपत्तियों को पूरी तरह से घोषित करने से बच सकते हैं। यह रनटाइम ओवरहेड को कम करेगा (यदि यह महत्वपूर्ण है)। मैसेजिंग ओवरहेड, चक्रों को बनाए रखना/छोड़ना, और परमाणु (स्वाभाविक रूप से) अधिक निष्पादन समय की आवश्यकता होगी। इसलिए इसे प्रदर्शन में सुधार के लिए बाईपास किया जा सकता है।
दृश्यता/रखरखाव। कभी-कभी, इंटरफ़ेस से ivar को छिपाने के लिए यह बहुत कम रखरखाव/कार्यान्वयन है। अन्य मामलों में, इवर कक्षा का कार्यान्वयन विवरण है, और सार्वजनिक इंटरफ़ेस का हिस्सा नहीं होना चाहिए। ऐसे मामलों में, इसे निजी बनाने पर विचार करें (ओबीजेसी में इसे जमा करने के कुछ तरीके हैं)।
मुझे विश्वास है कि इसे गेटटर/सेटर विधियों को बनाना चाहते हैं या नहीं, लेकिन मुझे उस पर उद्धरण न दें। कोको दिग्गजों के बीच यह सामान्य ज्ञान है, मुझे यकीन है कि कोई जल्द ही इसका उत्तर देगा :) –