2009-10-23 14 views
16

NSString स्ट्रिंग्स अपरिवर्तनीय हैं, stringWithString: क्लास विधि का मूल्य क्या है?+ [एनएसएसटींग स्ट्रिंगविथस्ट्रिंग:] - बिंदु क्या है?

NSMutableString के साथ उपयोग किए जाने पर मुझे उपयोगिता मिलती है, मैंने NSString कक्षा के साथ उपयोगिता को नहीं देखा।

उत्तर

20

आपके पास एक एनएसएमयूटेबलस्ट्रिंग (या कुछ घर से विकसित एनएसएसटींग सबक्लास) हो सकता है जिसे आप डुप्लिकेट करना चाहते हैं।

NSMutableString *buffer = [NSMutableString string]; 
// do something with buffer 
NSString *immutableStringToKeepAround = [NSString stringWithString:buffer]; 
बेशक

, आप भी सिर्फ एक प्रतिलिपि बना सकते हैं:

NSMutableString *buffer = [NSMutableString string]; 
// do something with buffer 
NSString *immutableStringToKeepAround = [[buffer copy] autorelease]; 

लेकिन आप प्रतिलिपि के मालिक हैं और जारी है या यह autorelease चाहिए।

+12

एक मामूली भेद यह है कि [[शून्य प्रतिलिपि] autorelease] शून्य वापस आ जाएगा, लेकिन [एनएसएसटींग स्ट्रिंगविथस्ट्रिंग: शून्य] एक अपवाद फेंक देगा। –

+0

कूल, मुझे यह नहीं पता था! हंडी जानकारी। –

9

के रूप में "एंडी" # 318,666 में बताते हैं, यह स्मृति प्रबंधन से संबंधित है, उद्धृत:

initWithString और stringWithString के बीच अंतर यह है कि stringWithString रिटर्न एक स्वत: जारी की सूचक है। इसका मतलब है कि आपको इसे विशेष रूप से रिलीज़ करने की आवश्यकता नहीं है, क्योंकि अगली बार ऑटो-रिलीज पूल किसी भी ऑटो-रिलीज़ पॉइंटर्स को साफ़ कर देगा।

initWithString, दूसरी तरफ, 1 की एक बरकरार गिनती के साथ एक सूचक लौटाता है - आपको उस सूचक पर रिलीज कॉल करने की आवश्यकता है, अन्यथा इसका परिणाम स्मृति रिसाव होगा।

(here से लिया)

1

एक स्ट्रिंग एक और दिए गए स्ट्रिंग से पात्रों को कॉपी करके बनाया रिटर्न

[NSString stringWithString:@"some string"] 

यह

[[[NSString alloc] initWithString:@"some string"] autorelease] 
+1

[क्यों कुछ स्ट्रिंग "@" नहीं है "हालांकि?] (Http: // stackoverflow।कॉम/प्रश्न/6280849/nsstring-stringwithstringsome-string-vs-some-string) – ma11hew28

1

इसके अलावा के बराबर है, अगर आपके पास एनएसएसटींग के लिए एक पॉइंटर, यह वास्तव में एनएसटीयूटीबल स्ट्रिंग जैसे एनएसएसटींग का उप-वर्ग हो सकता है। इसलिए, यदि आप स्ट्रिंग को स्टोर करना चाहते हैं और गारंटी दी जाती है कि यह नहीं बदलेगा, तो आपको इसकी प्रतिलिपि बनाना चाहिए, इसलिए stringWithString मौजूद है।

+2

सुनिश्चित नहीं है कि यह काफी मान्य है - चूंकि, जैसा कि आप इंगित करते हैं, NSMutableString NSString का उप-वर्ग है, आप वास्तव में 'NSString * स्ट्रिंग की तरह कुछ कर सकते हैं = @ "str"; NSMutableString * mStr = [NSMutableString stringWithString: string]; 'और एक mutable स्ट्रिंग वापस प्राप्त करें। – Tim

+0

@Tim: हाँ, यह मान्य है। – newacct

+0

मेरा मतलब था कि यदि आपके पास कोई तरीका है (void) setName: (NSString *) नाम; आप वास्तव में नहीं जानते कि नाम एनएसएसटींग या सबक्लास है या नहीं। तो, आप इसकी प्रतिलिपि बनाना चाहते हैं, इसलिए यह मान आपकी पीठ के पीछे नहीं बदलता है। –

1

एक और उपयोग के मामले के रूप में, अगर (जो भी कारण के लिए) आप NSString या NSMutableString की अपनी खुद की उपवर्ग बनाने के लिए, stringWithString: या तो NSString, NSMutableString, या MyCustomString का एक उदाहरण के साथ यह दृष्टांत के लिए एक आसान तरीका प्रदान करता है।

0

मैं अक्सर +stringWithString: का उपयोग करता हूं जब मुझे NSMutableString बनाने की आवश्यकता होती है लेकिन इसे प्रारंभिक मान से शुरू किया जाता है। उदाहरण के लिए:

NSMutableString * output = [NSMutableString stringWithString:@"<ul>"]; 
for (NSString * item in anArray) { 
    [output appendFormat:@"<li>%@</li>", item]; 
} 
[output appendString:@"</ul>"]; 
0

FYI करें, अब है कि हम संकलन कर रहे हैं एआरसी के साथ सक्षम, तो आप मैन्युअल बिल्कुल जारी करने के लिए नहीं है, एआरसी रिहाई संकलन समय के दौरान कॉल डाल देंगे। तो यह अभी भी अलग कैसे है? stringWithString अभी भी ऑटोरेलीज पूल में जोड़ा गया है जो भविष्य में कभी-कभी सूखा हो जाता है (जब तक कि आप अपना स्वयं का ऑटोोरलीज पूल नहीं बनाते)। फ़ंक्शन समाप्त होने से ठीक पहले initWithString में रिलीज़ कॉल होगा, इसलिए यदि आपने इसे विधि में कहीं भी नहीं रखा है, तो आप सुनिश्चित कर सकते हैं कि फ़ंक्शन कॉल के अंत तक स्ट्रिंग नष्ट हो जाती है। यह आपको ऑटोमोलेज्ड ऑब्जेक्ट्स का उपयोग करने के विरोध में मेमोरी प्रबंधन पर एक कड़ा नियंत्रण देता है।