2010-06-30 13 views
9

मैंने कई स्निपेट पढ़े हैं जो उल्लेख करते हैं कि आपको कभी भी अपने init या dealloc विधियों के भीतर डॉट-नोटेशन का उपयोग नहीं करना चाहिए। हालांकि, मुझे कभी पता नहीं लग रहा है क्यों। एक पद में गुजरने में उल्लेख किया गया है कि इसे केवीओ के साथ करना है, लेकिन अब और नहीं।उद्देश्य-सी डॉट सिंटेक्स और इनिट

@interface MyClass : NSObject { 
    SomeObject *object_; 
} 
@property (nonatomic, retain) SomeObject *object; 
@end 

यह कार्यान्वयन खराब है?

@implementation MyClass 

@synthesize object = object_; 

- (id)initWithObject:(SomeObject *)object { 
    if (self = [super init]) { 
     self.object = object; 
    } 

    return self; 
} 
@end 

लेकिन यह अच्छा है?

@implementation MyClass 

@synthesize object = object_; 

- (id)initWithObject:(SomeObject *)object { 
    if (self = [super init]) { 
     object_ = [object retain]; 
    } 

    return self; 
} 
@end 

आपके init के अंदर डॉट-नोटेशन का उपयोग करने के नुकसान क्या हैं?

+0

ऐसा लगता है कि दूसरे उदाहरण में आपको object_ = [ऑब्जेक्ट बरकरार रखना चाहिए]; – Vladimir

+0

तय, जल्दी लिखित उदाहरणों के साथ परेशानी। ;) – MarkPowell

उत्तर

25

सबसे पहले, यह विशेष रूप से डॉट नोटेशन नहीं है, यह उन एक्सेसर्स हैं जिन्हें आप उपयोग नहीं करना चाहिए।

self.foo = bar; 

समान

[self setFoo: bar]; 

है और वे दोनों init/dealloc के भीतर पर सिकोड़ी रहे हैं।

मुख्य कारण यह है कि एक उपclass आपके एक्सेसर्स को ओवरराइड कर सकता है और कुछ अलग कर सकता है। सबक्लास के एक्सेसर्स पूरी तरह से प्रारंभिक ऑब्जेक्ट मान सकते हैं यानी कि सबक्लास की init विधि में सभी कोड चलाए गए हैं। वास्तव में, इसमें से कोई भी नहीं है जब आपकी init विधि चल रही है। इसी प्रकार, सबक्लास के एक्सेसर्स उप-वर्ग की डेलोक विधि पर चलने पर निर्भर हो सकते हैं। जब आपकी डेलोक विधि चल रही है तो यह स्पष्ट रूप से गलत है।

+0

क्या किसी ने भी इस जवाब को वोट दिया होगा कृपया बताएं कि उन्होंने ऐसा क्यों किया? – JeremyP

1

आपके द्वारा अपने स्वयं के सेटर्स/गेटर्स लिखते समय मुख्य कारणों से मुख्य रूप से फसल उगने के कारण सामने आते हैं। विधियों के डिफ़ॉल्ट @ सिंथेसाइज्ड संस्करणों का उपयोग करते समय यह किसी भी मुद्दे का कारण नहीं बनता है। जब आप अपना खुद का सेटर लिखते हैं, तो आमतौर पर यह आपकी कक्षा पर एक दुष्प्रभाव होगा। यह दुष्प्रभाव शायद init में नहीं चाहता था, या यहां तक ​​कि मुद्दों का कारण बनने जा रहा है यदि यह अन्य ivars का संदर्भ देता है जो अभी तक नहीं बनाए गए हैं। डीलोक में वही समस्या, यदि आपके पास दुष्प्रभाव है, तो इसमें उड़ने की संभावना है।

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