मुझे यकीन है कि कितना उपयोग इस सवाल यह है कि नहीं कर रहा हूँ, लेकिन यह मेरे लिए दिलचस्प लगता है ...डॉट वाक्य रचना बनाम गेटर के साथ विधि वाक्य रचना =
मैंने सोचा था कि संपत्ति का उपयोग कर/संश्लेषण बयान मुझे के बराबर था गेटर बनाने/सेटर। इसलिए
// .h
@property (nonatomic) BOOL on;
// .m
@synthesize on = _on;
// In my mind synthesizes the following methods
// - (BOOL)on;
// - (void)setOn:(BOOL)on;
लेकिन अगर मैं निम्नलिखित करने के लिए घोषणाओं को बदलें:
v
@property (nonatomic, getter=isOn) BOOL on;
@synthesize on = _on;
// In my mind synthesizes the following
// - (BOOL)isOn;
// - (void)setOn:(BOOL)on;
तो ऊपर दिए गए मैं इतना गेटर ओवरराइड मैं जानता हूँ कि जब यह कहा जाता है:
- (BOOL)isOn;
{
NSLog(@"I was called");
return _on;
}
अब बुला उदाहरण पर निम्नलिखित (myClass
) परिणाम:
NSLog(@"%d", [myClass isOn]);
//=> 2012-02-09 22:18:04.818 Untitled[1569:707] I was called
//=> 2012-02-09 22:18:04.820 Untitled[1569:707] 1
NSLog(@"%d", myClass.isOn);
//=> 2012-02-09 22:18:24.859 Untitled[1599:707] I was called
//=> 2012-02-09 22:18:24.861 Untitled[1599:707] 1
NSLog(@"%d", myClass.on); // This is the one I didn't expect to work
//=> 2012-02-09 22:18:55.568 Untitled[1629:707] I was called
//=> 2012-02-09 22:18:55.570 Untitled[1629:707] 1
मैं हमेशा मान लिया था कि यह पूरी तरह से रूप में डॉट वाक्य रचना के साथ गेटर/सेटर उपयोग करने के लिए मान्य था अगर मैं इस अर्थ में एक संपत्ति का उपयोग कर रहा था
myClass.isOn;
myClass.on = on;
एक और question से यह सुझाव दिया गया कि जब डॉट का उपयोग कर वाक्य रचना मैं इस तरह संपत्ति नाम का उपयोग करना चाहिए:
myClass.on // Correct
myClass.isOn // Incorrect
इस काम करता है हालांकि यह थोड़ा कम तार्किक प्रतीत क्योंकि मैं जानता हूँ कि कोई अंतर्निहित विधि - (BOOL)on
यह बजाय - (BOOL)isOn
मेरे सवालों का (उत्तरार्द्ध उदाहरण का उपयोग) कर रहे हैं
- यह एक बग है या
myClass.on
वास्तव में चुपचाप- (BOOL)isOn
- कॉल करने के लिए शब्दार्थ बोल रहा राज्य लागू नहीं व्यवहार तक पहुँचने हूँ तो मेरे के वर्तमान उपयोग है बदला जाना चाहिए डॉट वाक्यविन्यास सही है? (
myClass.isOn
जैसे)
अद्यतन
हालांकि कोई भी स्पष्ट रूप से यह कहा गया है मैं तर्क है कि .isOn
का उपयोग कर बुरा प्रपत्र तथ्य की वजह से भले ही है कि हुड के नीचे एक ही विधि कहा जाता है, शब्दार्थ है isOn
एक प्रश्न पूछ रहा है, जो राज्य के बजाय अधिक व्यवहार है।
हालांकि मैं अभी भी जहां "जादू" तारों से चला जाता है पर कि [myClass isOn]
अद्यतन 2
में myClass.on
के लिए कॉल बदल जाता है डॉक्स के आसपास कुछ देखने के बाद पर स्पष्ट नहीं कर रहा हूँ और मैं पर इस खंड पाया Declared Properties।निम्नलिखित कोड का उपयोग कर सकते हैं मैं एक वर्ग 'गुण का निरीक्षण:
id MyClass = objc_getClass("MyClass");
unsigned int outCount, i;
objc_property_t *properties = class_copyPropertyList(MyClass, &outCount);
for (i = 0; i < outCount; i++) {
objc_property_t property = properties[i];
NSLog(@"Name: %s, attributes: %s\n", property_getName(property), property_getAttributes(property));
}
//=> 2012-02-10 07:10:28.333 Untitled[934:707] Name: on, attributes: Tc,GisOn,V_on
तो हमारे पास निम्न विशेषताओं:
- नाम = पर
- प्रकार = चार (टीसी)
- गेटर = ison (GISON)
- चर = _on (V_on)
रनटाइम पर उपलब्ध इस सारी जानकारी के साथ यह सवाल छोड़ देता है कि यह लुकअप रनटाइम पर किया गया है या कुछ उत्तरों जैसे संकलित समय का सुझाव है?
मुझे लगता है कि अवधारणात्मक रूप से क्या होता है मैं केवल अपने अवलोकनों के बजाय कुछ और दस्तावेज ढूंढने की कोशिश कर रहा था।कृपया मेरा अपडेट देखें, यदि यह संकलित समय या रनटाइम –
@ Paul.s पर किया गया है तो ठीक है। ठीक है, मैंने एक सरल परीक्षण चलाया (दोनों प्रकारों को संकलित करें और असेंबलर को देखें) और उत्तर कम से कम वर्तमान क्लैंग द्वारा संकलित समय है संकलक। जैसा कि मैंने उपर्युक्त सुझाव दिया है, यह समझ में आता है - जानकारी हेडर में रखी गई है और कार्यान्वयन में नहीं है। मैं वास्तव में कल्पना नहीं कर सकता कि यह रनटाइम पर क्यों किया जाएगा - रिज़ॉल्यूशन के रूप में 'कस्टम गेटटर' वास्तव में किस विधि को आमंत्रित करता है, अभी भी रनटाइम पर किया जाएगा। संपत्ति के नाम के रनटाइम रिज़ॉल्यूशन के लिए रनटाइम पर कस्टम गेटर नाम उपयोगी होने के लिए आपको रनटाइम पर उस मैपिंग को बदलने का समर्थन करना होगा। – CRD