मुझे @synthesize
अपने कोड में स्पष्ट रूप से कब जोड़ना चाहिए ?
आम तौर पर, यदि यह आवश्यक है: आप शायद उस मामले से कभी नहीं टकराएंगे जहां इसकी आवश्यकता है।
एक मामला है कि आप इसे उपयोगी पा सकते हैं, हालांकि।
कहते हैं कि आप एक कस्टम गेट्टर और सेटर दोनों लिख रहे हैं, लेकिन इसे वापस करने के लिए एक उदाहरण चर चाहते हैं। (एक परमाणु संपत्ति के लिए, यह एक कस्टम सेटर के रूप में सरल है: कंपाइलर एक गेटर लिखेगा यदि आप एक मोनोटोमिक संपत्ति के लिए एक सेटर निर्दिष्ट करते हैं, लेकिन एक परमाणु संपत्ति नहीं।)
इस पर विचार करो:
@interface MyObject:NSObject
@property (copy) NSString *title;
@end
@implementation MyObject
- (NSString *)title {
return _title;
}
- (void)setTitle:(NSString *)title {
_title = [title copy];
}
@end
यह काम नहीं करेगा, क्योंकि _title
मौजूद नहीं है। आपने एक गेटर या सेटर दोनों को निर्दिष्ट किया है, इसलिए Xcode (सही ढंग से) इसके लिए बैकिंग इंस्टेंस वेरिएबल नहीं बनाता है।
आपके पास इसे बनाने के लिए दो विकल्प हैं। आप इसे या तो बदल सकते हैं @implementation
:
@implementation MyObject {
NSString *_title;
}
- (NSString *)title {
return _title;
}
- (void)setTitle:(NSString *)title {
_title = [title copy];
}
@end
या इसे इसमें बदलें:
@implementation MyObject
@synthesize title = _title;
- (NSString *)title {
return _title;
}
- (void)setTitle:(NSString *)title {
_title = [title copy];
}
@end
दूसरे शब्दों में, यद्यपि संश्लेषित करना व्यावहारिक उद्देश्यों के लिए आवश्यक नहीं है *, इसका उपयोग संपत्ति-बैकिंग उदाहरण चर को परिभाषित करने के लिए किया जा सकता है जब आप एक गेट्टर / सेटर प्रदान कर रहे हैं। आप यह तय कर सकते हैं कि आप यहां किस फॉर्म का उपयोग करना चाहते हैं।
अतीत में, मैंने उदाहरण चर को निर्दिष्ट करने का पक्ष लिया है @implementation {}
, लेकिन मुझे अब लगता है कि @synthesize
मार्ग एक बेहतर विकल्प है क्योंकि यह निरर्थक प्रकार को हटा देता है और स्पष्ट रूप से बैकिंग चर को संपत्ति से जोड़ता है:
- संपत्ति का प्रकार बदलें, और उदाहरण चर का प्रकार बदलता है।
- इसके स्टोरेज क्वालिफायर को बदलें (उदाहरण के लिए, इसे कमजोर की बजाय मजबूत या मजबूत बनाएं) और स्टोरेज क्वालिफायर बदल जाते हैं।
- संपत्ति निकालें या नाम बदलें, और
@synthesize
एक संकलक त्रुटि उत्पन्न करेगा। आप आवारा उदाहरण चर के साथ समाप्त नहीं होंगे।
* -मैं एक मामला जानता हूं जहां यह आवश्यक था, कई फाइलों में श्रेणियों के बीच बंटवारे की कार्यक्षमता से संबंधित। और मुझे आश्चर्य नहीं होगा अगर Apple इसे ठीक करता है, या पहले से ही है।