2012-12-08 19 views
15

मैं मानक नमूना विभाजन दृश्य के साथ खेल रहा था जो एक्सकोड में एक स्प्लिट व्यू एप्लिकेशन का चयन करते समय बनाया जाता है, और कुछ फ़ील्ड जोड़ने के बाद मुझे उन्हें प्रदर्शित करने के लिए कुछ फ़ील्ड जोड़ने की आवश्यकता होती है विस्तार से देखें।उद्देश्य सी अंडरस्कोर संपत्ति बनाम स्वयं

और कुछ दिलचस्प दिलचस्प नमूना मूल नमूना में, मास्टर व्यू विस्तृत विवरण में "detailItem" प्रॉपर्टी सेट करता है और विस्तार दृश्य इसे प्रदर्शित करता है।

- (void)setDetailItem:(id) newDetailItem 
{ 
if (_detailItem != newDetailItem) { 
    _detailItem = newDetailItem; 

    // Update the view. 
    [self configureView]; 
} 

मैं समझता हूं कि यह क्या करता है और सब कुछ, इसलिए जब मैं इसके साथ खेल रहा था। मैंने सोचा कि यह वही होगा यदि _detailItem की बजाय मैंने self.detailItem का उपयोग किया, क्योंकि यह कक्षा की संपत्ति है।

हालांकि, जब मैं

self.detailItem != newDetailItem 

मैं वास्तव में एक पाश में फंस जहां इस विधि लगातार कहा जाता है का इस्तेमाल किया और मैं सिम्युलेटर में कुछ और नहीं कर सकते।

मेरा प्रश्न है, अंडरस्कोर चर (ivar?) और गुणों के बीच वास्तविक अंतर क्या है? मैंने यहां कुछ पोस्ट पढ़ी हैं, ऐसा लगता है कि यह कुछ उद्देश्य सी सम्मेलन है, लेकिन वास्तव में कुछ अंतर आया है।

उत्तर

6

अपने प्रयोग के दौरान, आपने एक अंतहीन पाश स्थापित किया है, यही कारण है कि सिम्युलेटर गैर-प्रतिक्रियाशील हो जाता है। अपनी कक्षा संपत्ति detailItem के लिए एक कस्टम सेटर विधि को लागू करता है के बाद से

setDetailItem: के दायरे के भीतर self.detailItem कॉलिंग रिकर्सिवली setDetailItem: कहता है।

मैं आपको गुणों, ivars, आदि पर स्कूप के लिए घोषित गुणों पर Apple documentation पर संदर्भित करता हूं; लेकिन संक्षेप में, घोषित संपत्तियां आपकी कक्षा के लिए एक्सेसर विधियां प्रदान करने का एक सरल तरीका हैं। अपने स्वयं के एक्सेसर विधियों को लिखने के बजाय (जैसा कि हमें उद्देश्य-सी 2.0 से पहले करना था) वे अब आपके लिए संपत्ति सिंटैक्स के माध्यम से जेनरेट किए गए हैं।

+0

अहह, ऐसी स्पष्ट गलती। बहुत बहुत धन्यवाद – Pita

+0

इसके लिए धन्यवाद! – cp3

5

गुण मूल रूप से किसी दिए गए उदाहरण चर के लिए एक सेटर और गेटर उत्पन्न करने के लिए संकलक का एक तरीका है।

तो जब आप की तरह कुछ का उपयोग करें:

id detailItem = self.detailItem; 

क्या आप हुड के नीचे क्या कर रहे है:

id detailItem = [self detailItem]; 

एक ही के लिए:

self.detailItem = otherDetailItem; 

होगा:

[self setDetailItem:otherDetailItem]; 

तो जब आप खुद को सेटर लिखते हैं .. आप एक अनंत लूप में आते हैं क्योंकि आप स्वयं ही विधि को एक्सेस करते हैं। आप स्वतंत्र रूप से 'स्वयं' का उपयोग कर सकते हैं। आपकी कक्षा में नोटेशन, जब आप ऊपर वर्णित तंत्र की वजह से सेटटर या एक्सेसर को ओवरराइड नहीं कर रहे हैं।

एक कक्षा में मामले जहां मैं उपयोग करता हूं।केवल इवर तक पहुंचने पर संकेत यह है कि जब मैं मूल्य बदलता हूं, तो आप अपनी कक्षा के अंदर कभी नहीं जानते कि जब आप मूल्य बदलते हैं तो क्या होता है। क्या आपके पास ऐसी स्थिति के मामले में कुछ है जो कुछ प्रतिनिधि को सूचित करना चाहिए कि स्थिति बदल गई है? आम तौर पर यह मामला नहीं है, हालांकि, बस इसका उपयोग करके। नोटेशन आप यह सुनिश्चित कर रहे हैं कि भविष्य में आपको कुछ कोड को दोबारा नहीं करना पड़ेगा यदि आपने अपने सेटर विधि में कुछ जादू करने का फैसला किया है।

39

_property का अर्थ है कि आप सीधे संपत्ति तक पहुंच रहे हैं।

self.property का मतलब है कि आप एक्सेसर्स का उपयोग कर रहे हैं।

आपके मामले में, सेटर विधि में आप इसे कॉल कर रहे हैं, एक रिकर्सिव कॉल बना रहे हैं।

2

मैं एक उदाहरण बना देंगे (बिना एआरसी सक्षम):

@property (nonatomic, retain) NSNumber* number; 

आप इसे संश्लेषित नहीं है, तो आप इसे इस तरह उपयोग कर सकते हैं:

self.number= [NSNumber numberWithBool: YES]; 

इस मामले में नंबर retained.If बजाय आप इसे संश्लेषण और संपत्ति का उपयोग नहीं करते: फ़ाइल में बाद में

@synthesize number; 

:

number=[NSNUmber numberWithBool: YES]; 

आपने संपत्ति का उपयोग नहीं किया है, इसलिए संख्या को बनाए रखा नहीं गया है। यह एक्सेसर्स और संश्लेषित गुणों का उपयोग करने के बीच एक प्रासंगिक अंतर बनाता है।

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