2011-10-29 7 views
15

मैं एक अदिश संपत्ति प्रकार के साथ एक वर्ग है कहते हैं:मिक्सिंग सी प्री/पोस्ट वृद्धि/उद्देश्य-सी डॉट ऑपरेटर के साथ कमी काम करता है?

@property (nonatomic, assign) int myInt; 

और स्पष्टता के लिए, संश्लेषित की तरह:

@synthesize myInt = _myInt; 

तो किसी ने मुझसे पूछा था, तो निम्न पंक्ति काम करेगा:

self.myInt++; 

मैंने कहा "नहीं"। तर्क यह है कि हम सभी जानते हैं कि डॉट ऑपरेटर केवल कंपाइलर से उत्पन्न गेटर विधि को कॉल करने के लिए सिंटैक्टिक चीनी है। ताकि लाइन सचमुच है:

[self myInt]++; 

आप टाइप कि Xcode में दूसरी पंक्ति है, यह संकलन नहीं होंगे करते हुए कहा है: " 'केवल पढ़ने के लिए' की अनुमति नहीं एक उद्देश्य-सी संदेश का वापसी परिणाम के लिए नियत"। यह सही समझ में आता है, और यही वह है जो मैंने अपेक्षित किया होगा। यहां तक ​​कि अगर संकलित किया गया है, तो भी मैं उम्मीद करता हूं कि परिणाम बैकिंग इवर की एक प्रतिलिपि को ढेर पर बढ़ाएंगे, न कि इवर स्वयं।

लेकिन, निर्देश self.myInt++ संकलित करता है, और यह काम करता है। यह ठीक उसी तरह काम करता है जैसे कि डॉट ऑपरेटर सीधे _myInt तक पहुंच रहा था। मेरे अपने getters और setters की आपूर्ति, मैं, देख सकते हैं कि दोनों गेटर और सेटर प्रक्रिया में उपयोग किया जाता है, इसी क्रम में जैसे कि यह वास्तव में था:

[self setMyInt:[self myInt] + 1]; 

तो, यह नियम का एक अपवाद है कि डॉट ऑपरेटर बिल्कुल एक विधि कॉल के समान है, या {--, ++, +=, -=} ऑपरेटरों को ऑब्जेक्टिव-सी कंपाइलर द्वारा विशेष ध्यान दिया जाता है जब डॉट नोटेशन के साथ उपयोग किया जाता है? मैंने हमेशा उन्हें सी भाषा सुविधाओं के रूप में सोचा है जिसमें उद्देश्य-सी के लिए कोई विशेष विचार नहीं है। मैं देख सकता था कि सरल रेखा उद्देश्य-सी डॉट नोटेशन से अपरिचित किसी के लिए बहुत भ्रमित हो रही है।

उत्तर

11

आप असेंबलर आउटपुट देख सकते हैं और देख सकते हैं कि यह दो _objc_msgSend कॉल उत्पन्न करता है।

मैं इसे और अधिक नियम को लागू करने कि a++a = a + 1 के लिए वाक्यात्मक चीनी

+0

Do उपसर्ग ऑपरेटरों ('++ self.myInt') भी लागू है की एक मामला है लगता होगा? –

+0

डिस्सेबलर आउटपुट को देखते हुए, मैं दो 'objc_msgSend' देखता हूं तो हां। आप संपत्ति में वृद्धि कर रहे हैं। –

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