2012-02-05 15 views
6

का उपयोग करते हैं तो मेरे पास गेटर्स और इंस्टेंस चर का उपयोग करने के बारे में एक प्रश्न है। चलो एक उदाहरण देखें।आईओएस जब आवृत्ति चर या गेटर विधि

मान लीजिए मैं एक ज फ़ाइल में है:

@property (nonatomic,strong) NSString *name 

और .m फ़ाइल में मैं संश्लेषण इस तरह से चर:

@synthesize name = _name; 

अब मेरी सवाल यह है: क्या बीच का अंतर है का उपयोग करें:

[self.name aMethod] 

और

[_name aMethod] 

धन्यवाद!

उत्तर

8

पहला वाला गेटर विधि के माध्यम से ivar तक पहुंचता है। दूसरा सीधे आईवर तक पहुंचता है। चूंकि यह एक सरल, संश्लेषित संपत्ति है, इसलिए इसमें कोई अंतर नहीं है, सिवाय इसके कि पहले एक अतिरिक्त विधि कॉल करता है। हालांकि, अगर संपत्ति परमाणु, या गतिशील, या गेटर विधि जटिल थी, तो इसमें एक अंतर होगा कि पहला वास्तव में परमाणु होगा जबकि दूसरा नहीं होगा और पहला वास्तव में किसी भी जटिल तर्क को ट्रिगर करेगा गेटटर जबकि दूसरा नहीं होगा।

आसान शब्दों में, संकलक करने के लिए पहली कॉल फिर से लिखते हैं:

[[self name] aMethod] 

जबकि दूसरी कॉल बस छोड़ दिया है के रूप में है।

1
[self.name aMethod] 

इस प्रकार एक गेटर कहा जाता है

[[self name] aMethod] 

के बराबर है और संदेश उसके परिणाम को भेजा जाता है।

आपके मामले में, दृश्यमान परिणाम वही होगा।

हालांकि, यह मामला नहीं हो सकता है अगर गेटटर छोटा नहीं था (यानी संश्लेषित)।

0

गेटर के माध्यम से पहली कॉल - यह [[self name] aMethod] के बराबर है। दूसरा सीधे सीधी पहुंच का उपयोग करता है।

आपको आमतौर पर एक्सेसर्स का उपयोग करने का पक्ष लेना चाहिए, लेकिन ऐसे समय होते हैं जहां आपको इससे विचलित होना चाहिए। सबसे आम घटना आंशिक रूप से निर्मित राज्यों में होती है, जैसे आपका प्रारंभकर्ता और dealloc। इसका कारण यह है कि आपको सावधानीपूर्वक अपने राज्य का निर्माण या नष्ट करना चाहिए, और अपने ऑब्जेक्ट के इंटरफ़ेस अर्थशास्त्र में रूचि नहीं रखना चाहिए - यानी, एक्सेसर्स का उपयोग नकारात्मक व्यवहार और अर्थपूर्ण साइड इफेक्ट्स हो सकता है।

कारणों की एक और पूरी सूची यहां मिल सकती है: Why would you use an ivar?

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