2010-04-29 12 views
22

मैं एक ऐसी संपत्ति बनाने की कोशिश कर रहा था जो केवल पढ़ने योग्य है। मैं इस वर्ग के उदाहरण बनाने वाले वर्ग से मूल्य के साथ आरंभ करना चाहता था, उदा।एक पठनीय संपत्ति को शुरू करना

@property (retain,readonly) NSString *firstName;

और मैं इस तरह यह प्रारंभ करने की कोशिश की:

-(id)initWithName:(NSString *)n{ self.firstName = n; }

एक बार मैं ऐसा किया, संकलक कि केवल पढ़ने के लिए संपत्ति नहीं सौंपा जा सकता है एक त्रुटि की सूचना दी। तो मैं यह कैसे कर सकता हूँ?

firstName = [n retain]; //Or copy 

यह आम तौर पर वैसे भी किसी भी init और dealloc तरीकों में setters बायपास करने के लिए सलाह दी जाती है:

उत्तर

13

संश्लेषित सेटर प्रयोग न करें।

+0

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

+0

को भी संशोधित किया है यह समस्या क्यों होगी? 'Firstname = [n retain]' का उपयोग करके 'पहले' नाम को 'n' पर पॉइंटर बना देगा। तो हाँ, जब कोई अन्य वस्तु इस संपत्ति तक पहुंच जाती है, तो मूल्य वहां होगा। :) – Rengers

+0

अगर मैं इस संपत्ति को एक्सेस करने का प्रयास करता हूं, तो मुझे निम्न अपवाद मिल रहा है। प्रोग्राम को सिग्नल प्राप्त हुआ: "EXC_BAD_ACCESS"। और यह त्रुटि किसी अन्य संपत्ति के कारण नहीं है। मैंने डीबगर में बहुत कुछ की जांच की। यह संपत्ति "दायरे से बाहर" दिखाती है। और अगर मैं इसे self.firstName = n; के साथ असाइन करता हूं। तो सब कुछ ठीक काम करता है। – awsome

38

या तो सीधे आवृत्ति चर को असाइन करें (यदि आपको इसकी आवश्यकता हो तो retain या copy जोड़ने के लिए मत भूलना) या किसी निजी वर्ग एक्सटेंशन में संपत्ति को फिर से शुरू करना न भूलें। इस तरह:

अपने ज फ़ाइल में:

@property (readonly, copy) NSString *firstName; 

अपने .m फ़ाइल में:

@interface MyClass() 

// Redeclare property as readwrite 
@property (readwrite, copy) NSString *firstName; 

@end 


@implementation MyClass 

@synthesize firstName; 
... 

अब आप अपने कार्यान्वयन में संश्लेषित सेटर उपयोग कर सकते हैं लेकिन वर्ग इंटरफ़ेस अभी भी पता चलता संपत्ति के रूप में पढ़ने के रूप में। ध्यान दें कि आपकी कक्षाएं आयात करने वाली अन्य कक्षाएं अभी भी -[MyClass setFirstName:] पर कॉल कर सकती हैं लेकिन वे नहीं जान पाएंगे कि यह मौजूद है और एक कंपाइलर चेतावनी प्राप्त होगी।

+0

यह एक अच्छा कामकाज दिखता है। धन्यवाद। – awsome

+0

क्या @Renger द्वारा सुझाए गए दृष्टिकोण के साथ संश्लेषित सेटटर बनाम उपयोग करने का कोई फायदा है? – Madbreaks

2

आप सीधे के साथ संपत्ति का उपयोग कर सकते हैं:

_firstName = n;

सेटर विधि का मतलब है कि self.firstName = n क्योंकि आप @property (retain,readonly) NSString *firstName; में readonly निर्दिष्ट, इसलिए संकलक त्रुटि संश्लेषित नहीं किया जाएगा।

+0

कोई _firstName नहीं है ... –

+0

यह मेरी समझ है कि _firstName मौजूद होगा। जब संपत्ति घोषित की जाती है तो यह अंतर्निहित ivar होता है। एक्सकोड 4.6 के रूप में संकलक स्वचालित रूप से आपके लिए इसे बनाना चाहिए। – Bob9630

+0

यह मेरी समझ भी है @ बॉब 9630। इस प्रश्न के अन्य उत्तरों ने मेरे मामले में वांछित परिणाम नहीं दिए, जबकि ऐसा हुआ। –

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