2012-02-13 10 views
10

क्या है के बीच का अंतर:NSString आवंटन और आरंभ

NSString *string1 = @"This is string 1."; 

और

NSString *string2 = [[NSString alloc]initWithString:@"This is string 2.]; 

मैं क्यों आवंटन कर रहा हूँ नहीं और पहली स्ट्रिंग आरंभ, फिर भी यह अभी भी काम करता है? मैंने सोचा कि मुझे एनएसएसटींग आवंटित करना था क्योंकि यह एक वस्तु है?

कोको टच में,

-(IBAction) clicked: (id)sender{ 
    NSString *titleOfButton = [sender titleForState:UIControlStateNormal]; 
    NSString *newLabelText = [[NSString alloc]initWithFormat:@"%@", titleOfButton]; 
    labelsText.text=newLabelText; 
    [newLabelText release]; 
} 

मैं क्यों आवंटित और titleOfButton स्ट्रिंग के लिए प्रारंभ नहीं करते हैं? क्या मैं जिस विधि को बुलाता हूं वह मेरे लिए करता है?

इसके अलावा, मैं एक्सकोड 4 का उपयोग कर रहा हूं, लेकिन मैं आईओएस 5 को नापसंद करता हूं, और ऐसा इसलिए है, इसलिए यदि मैं महत्वपूर्ण हूं तो मैं एआरसी का उपयोग नहीं करता हूं। कृपया यह न कहें कि मुझे चाहिए, मैं यह जानने के लिए यहां हूं कि ऐसा क्यों है। धन्यवाद!

+0

के संभावित डुप्लिकेट [Do NSString वस्तुओं alloc और init करने की आवश्यकता है?] (Http://stackoverflow.com/questions/637022/do-nsstring-objects-need-to-be-alloc-and-init) – Caleb

उत्तर

13

परिवर्तनीय string1 एक NSStringstring literal है। कंपाइलर आपके निष्पादन योग्य फ़ाइल में इसके लिए स्थान आवंटित करता है। यह स्मृति में लोड होता है और आपका प्रोग्राम चलाए जाने पर प्रारंभ होता है। जब तक ऐप चलता है तब तक यह रहता है। आपको retain या release की आवश्यकता नहीं है।

परिवर्तनीय string2 का जीवनकाल तब तक होता है जब तक आप release का अंतिम संदर्भ इंगित करते हैं। आप इसके लिए जगह आवंटित करते हैं, इसलिए आप इसके बाद सफाई के लिए जिम्मेदार हैं।

परिवर्तनीय titleOfButton का जीवन -clicked: विधि का जीवन है। ऐसा इसलिए है क्योंकि विधि -titleForState:autorelease -d NSString देता है। एक बार जब आप विधि का दायरा छोड़ देते हैं, तो वह स्ट्रिंग स्वचालित रूप से रिलीज़ हो जाएगी।

आपको newLabelText बनाने की आवश्यकता नहीं है। वह कदम अनावश्यक और गन्दा है।

labelsText.text = titleOfButton; 

का उपयोग क्यों करें गुण: बस labelsText.text संपत्ति titleOfButton करने के लिए सेट? चूंकि यह retain प्रॉपर्टी सेट करने से titleOfButton की संदर्भ संख्या में वृद्धि होगी (यही कारण है कि इसे retain प्रॉपर्टी कहा जाता है), और इसलिए titleOfButton द्वारा इंगित स्ट्रिंग -clicked: के अंत तक लाइव रहेगी।

इस उदाहरण में retain के उपयोग के बारे में सोचने का एक और तरीका यह है कि labelsText.texttitleOfButton द्वारा इंगित स्ट्रिंग का "स्वामित्व" ले रहा है। वह स्ट्रिंग अब तक labelsText जीवन तक चली जाएगी (जब तक कि कुछ अन्य चर स्ट्रिंग का स्वामित्व भी न लें)।

+0

इस बिंदु पर विस्तार करने के लिए, उद्देश्य सी में '@' स्टाइल स्ट्रिंग अक्षर पर 'बनाए रखने 'और' रिलीज 'पर कॉल स्पष्ट रूप से अनदेखा कर दिए जाते हैं। आप इसे पूरे दिन 'रिलीज' कर सकते हैं और इसे मुक्त नहीं किया जाएगा। – StilesCrisis

+0

तो मूल रूप से, मेरे पास उस कोड में जो कुछ भी है वह सही है, और मैं केवल newLabelText स्ट्रिंग को हटा सकता हूं? और उसके बाद उपयोगकर्ता लेबल शीर्षक को सेट करने के लिए संश्लेषित सेटटर? मैं अभी भी नया हूं, लेकिन जब आप कहते हैं कि 'इस रखरखाव की संपत्ति को स्थापित करना' क्या आप कह रहे हैं कि मुझे इसे बनाए रखना चाहिए? –

+0

'labelsText.text' प्रॉपर्टी उस स्ट्रिंग को बरकरार रखती है जिसे आपने सेट किया है।तो आपको 'बनाए रखने' का उपयोग करने की आवश्यकता नहीं है, क्योंकि आप अपने लिए ऐसा करने के लिए संपत्ति मूल्य असाइनमेंट का उपयोग कर रहे हैं। उद्देश्य-सी गुणों की लंबी व्याख्या के लिए इस ट्यूटोरियल को देखें: http://www.raywenderlich.com/2712/using-properties-in-objective-c-tutorial –