संख्या 1 आगे मात्रा को कम करने MyOtherObject वर्ग की घोषणा के द्वारा अन्य दो से अलग है कंपाइलर और लिंकर द्वारा देखा गया कोड और संभावित रूप से ए शून्य परिपत्र संदर्भ। यदि आप ऐसा करते हैं तो #import को .m फ़ाइल में रखना याद रखें।
@property घोषित करके, (और .m में फ़ाइल @ सिंथेसाइजिंग से मिलान करके), आप स्मृति निर्दिष्ट अर्थों के साथ एक्सेसर विधियों को स्वत: जेनरेट करते हैं जो आप निर्दिष्ट करते हैं। अधिकांश वस्तुओं के लिए अंगूठे का नियम बरकरार रहता है, लेकिन उदाहरण के लिए, एनएसएसटींग्स को कॉपी का उपयोग करना चाहिए। जबकि सिंगलेट और प्रतिनिधि आमतौर पर असाइन का उपयोग करना चाहिए। हैंड-राइटिंग एक्सेसर्स थकाऊ और त्रुटि-प्रवण है, इसलिए यह बहुत सारे टाइपिंग और गूंगा बग बचाता है।
self.otherObj = someOtherNewObject; // set it
MyOtherObject *thingee = self.otherObj; // get it
इसके बजाय सामान्य, संदेश-गुजर रास्ते से
:
इसके अलावा, एक संश्लेषित संपत्ति घोषित करने आप इस तरह डॉट अंकन का उपयोग एक्सेसर विधि कॉल की सुविधा देता है
[self setOtherObject:someOtherNewObject]; // set it
MyOtherObject *thingee = [self otherObj]; // get it
पर्दे के पीछे आप वास्तव में इस तरह की एक विधि को कॉल कर रहा है:
- (void) setOtherObj:(MyOtherObject *)anOtherObject {
if (otherObject == anOtherObject) {
return;
}
MyOtherObject *oldOtherObject = otherObject; // keep a reference to the old value for a second
otherObject = [anOtherObject retain]; // put the new value in
[oldOtherObject release]; // let go of the old object
} // set it
... या यह
- (MyOtherObject *) otherObject {
return otherObject;
} // get it
बट में कुल दर्द, दाएं। अब कक्षा में प्रत्येक ivar के लिए ऐसा करें। यदि आप इसे बिल्कुल सही नहीं करते हैं, तो आपको स्मृति रिसाव मिलती है। बस कंपाइलर काम करने के लिए सबसे अच्छा है।
मुझे लगता है कि संख्या 1 में एक ivar नहीं है। यह मानते हुए कि यह एक टाइपो नहीं है, यह ठीक है क्योंकि @property/@ सिंथेसाइज निर्देश दृश्यों के पीछे भी आपके लिए एक ivar घोषित करेंगे। मुझे विश्वास है कि यह मैक ओएस एक्स - हिम तेंदुए और आईओएस 4 के लिए नया है।
संख्या 3 में उन एक्सेसर्स उत्पन्न नहीं हुए हैं, इसलिए आपको उन्हें स्वयं लिखना होगा। यदि आप अपने एक्सेसर विधियों को साइड इफेक्ट्स चाहते हैं, तो आप ऊपर दिखाए गए अनुसार अपने मानक मेमोरी प्रबंधन नृत्य करते हैं, फिर एक्सेसर विधि के अंदर आपको जो भी पक्ष काम करना है, उसे करें। यदि आप एक संपत्ति को संश्लेषित करते हैं और साथ ही अपना खुद का लिखते हैं, तो आपके संस्करण की प्राथमिकता है।
क्या मैंने सब कुछ शामिल किया?
हाँ, बहुत बहुत धन्यवाद! एक नोट जो मैं बनाना चाहता हूं वह यह है कि यदि आप # 1 में आगे की कक्षा प्रगामा लेते हैं और इसे #import "MyOtherObject" के साथ प्रतिस्थापित करते हैं तो आपको संकलन समय त्रुटि मिलती है, सुनिश्चित नहीं है कि क्यों .... – ennuikiller
त्रुटि क्या है क्या आपको मिलता है? – willc2
दृष्टिकोण # 1 पर दृष्टिकोण # 2 का उपयोग करने का कोई फायदा है? – Greg