2012-08-29 24 views
10

संभव डुप्लिकेट के साथ स्वयं के उपयोग और अंडरस्कोर (_):
How does an underscore in front of a variable in a cocoa objective-c class work?iOS: चर

मैं जैसे कि यह synthesizing के बाद बहुत स्वयं का उपयोग कर या चर नाम के साथ रेखांकित के साथ भ्रमित किया गया है नीचे:

In .h file: 
@property(nonatomic, strong) NSMutableArray *users; 

In .m file: 
@synthesize users = _users; 

जब मैं self.users का उपयोग करता हूं, तो मेरी समझ के आधार पर, ओएस निश्चित रूप से रिले करना सुनिश्चित करेगा सेट विधि में पहले आवंटित स्मृति को कम करें ताकि हमें स्पष्ट रूप से देखभाल करने की आवश्यकता न हो।

_users उपयोगकर्ताओं के लिए एक आवृत्ति चर है और उपयोगकर्ताओं के चर का उपयोग करते समय सामान्य रूप से उपयोग किया जाना चाहिए। अगर मैं इसका मूल्य बदलने के लिए _users का उपयोग करता हूं तो यह केवीओ प्रतिनिधि को नहीं फेंक देगा जो उपयोगकर्ता मूल्य परिवर्तन को देखने वाले वर्ग को सूचित नहीं करेगा।

इसके अलावा, self.users नीचे की तरह विधि नाम पर डमी चर फर्क अनुमति देता है,

- (void)assignUsers:(NSMutableArray*)users { 
     self.users = users; 
} 

कोई मुझे बता सकते अगर वहाँ कुछ भी है कि मैं गलत या लापता समझा _users या self.users का उपयोग करते समय है। धन्यवाद।

+0

हाय @ क्गाल मैं उस धागे से गुजर गया और यदि आप मेरा प्रश्न पढ़ते हैं, तो अधिकांश अंक निष्कर्ष बिंदु हैं लेकिन मुझे क्या नहीं मिल सका जब इसका उपयोग करना है! – applefreak

उत्तर

8

मुझे लगता है कि यह इस बात पर विचार करने में मदद करता है कि संकलक द्वारा गुण कैसे लागू किए जाते हैं (या हो सकता है)।

जब आप self.users = array; लिखने संकलक [self setUsers:array]; को यह तब्दील हो जब आप array = self.users; लिखने संकलक array = [self users];

@synthesize को यह तब्दील अपने वस्तु के लिए एक इवर कहते हैं (जब तक आप इसे जोड़ा खुद), और -users लागू करता है और आप के लिए -setUsers: एक्सेसर विधियों (जब तक आप अपनी खुद की प्रदान)

आप उपयोग कर रहे हैं एआरसी, -setUsers: कुछ ऐसी दिखाई देगी: यदि आप एमआरसी उपयोग कर रहे हैं

- (void)setUsers:(NSArray *)users 
{ 
    _users = users; // ARC takes care of retaining and release the _users ivar 
} 

(अर्थात एआरसी सक्षम नहीं है), -setUsers: * कुछ ऐसी दिखाई देगी:

- (void)setUsers:(NSArray *)users 
{ 
    [users retain]; 
    [_users release]; 
    _users = users; 
} 

* - ध्यान दें कि यह एक सरल, -setUsers:

+0

धन्यवाद निक! – applefreak

+0

इस विषय पर एकमात्र उत्तर जो इस तरह के लालित्य के साथ परिप्रेक्ष्य की गणना करने वाले संदर्भ से अंतर के बारे में बात करता है। अति उत्कृष्ट। – Ash

31

जब आप self.users का उपयोग कर रहे हैं, तो आप प्रेटर या गेटर के माध्यम से संपत्ति का उपयोग करते हैं।

जब आप _users का उपयोग कर रहे हैं, तो आप संपत्ति को सीधे सेटटर या गेटर को छोड़ दें।

- (void)setUsers:(id)users { 
    self.users = users; // WRONG : it causes infinite loop (and crash), because inside the setter you are trying to reach the property via setter 
} 

और

- (void)setUsers:(id)users { 
    _users = users; // GOOD : set your property correctly 
} 

इस गेटर के मामले में बिंदु के रूप में अच्छी तरह से है:


यहां इसके बारे में एक अच्छा प्रदर्शन है। आईओएस कोई फर्क नहीं पड़ता कि कैसे आप का सूचक जारी वस्तु dealloc होगा अगर वहाँ कोई और अधिक मजबूत सूचक है जो इसे जीवित रहता है,:


बुनियादी स्मृति प्रबंधन ( MRR या ARC के मामले में) के बारे में

वस्तुओं।

+3

प्रिय ** डाउन-वोटर **! मुझे कुछ फीडबैक प्राप्त करने के लिए सम्मानित किया गया था कि क्यों आपके हाथ डाउन-वोटर बटन से ऊपर हिला रहे थे, क्योंकि - आपको विश्वास था या नहीं - मैं इसे समझने के लिए एक दिमागी पाठक नहीं हूं। धन्यवाद! – holex

+0

मुझे यकीन नहीं है कि आपका मतलब यह है कि: _ "आप 'स्वयं' का दुरुपयोग दिखाते हैं और ..." _, क्या आप कृपया विस्तृत कर सकते हैं? _good demonstration_ सेटर के अंदर _same_ setter को बाईपास करने और कॉल करने के बीच __difference__ दिखा रहा है, जो अनंत रिकर्सिव लूप का कारण बनता है और जब स्टैक ओवरफ्लो हो जाता है तो यह क्रैश हो जाता है - इसलिए अंतिम दृष्टिकोण रनटाइम में अनंत लूप का कारण बन रहा है। – holex

2

की nonatomic कार्यान्वयन है हां, यह काफी सही है। कुछ मामूली अंक:

आईओएस स्वचालित रूप से ऑब्जेक्ट को रिलीज़ नहीं करता है क्योंकि आप डॉट नोटेशन का उपयोग करते हैं। यह किसी ऑब्जेक्ट को रिलीज़ करता है जब संपत्ति को copy या retain (या strong एआरसी में घोषित किया जाता है) के रूप में घोषित किया जाता है। यदि, उदाहरण के लिए, आप गैर-एआरसी कोड का उपयोग कर रहे हैं और संपत्ति assign के रूप में घोषित की गई है, तो यह ऑब्जेक्ट को रिलीज़ नहीं करेगा।

डेवलपर toolchain (Xcode 4.4+) के नवीनतम संस्करण के साथ

, तो आप मैन्युअल रूप से नहीं गुण संश्लेषण के लिए है - वे स्वचालित रूप से (अग्रणी अंडरस्कोर के साथ) संश्लेषित कर रहे हैं।

+0

धन्यवाद जिम। मैंने आईओएस 6 के साथ एक्सकोड 4.4 की कोशिश की और हां इसे संश्लेषित गुणों की आवश्यकता नहीं है, लेकिन क्या ऐप आईओएस के निचले संस्करण पर काम करेगा? – applefreak

+1

हां - आधिकारिक दस्तावेज़ीकरण से: [डिफ़ॉल्ट '@ संश्लेषण' सुविधा के लिए कोई विशेष एसडीके या रनटाइम समर्थन की आवश्यकता नहीं है।] (Http://developer.apple.com/library/ios/#documentation/DeveloperTools/Conceptual/WhatsNewXcode/Articles /xcode_4_4.html#//apple_ref/doc/uid/TP40011649-SW11) ऐसे प्रश्न, आपको दस्तावेज़ पढ़ना चाहिए। – Jim

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

  • कोई संबंधित समस्या नहीं^_^