2012-01-11 13 views
6

मैं @"" और [NSString string] के पेशेवरों और विपक्ष को काम करने की कोशिश कर रहा हूं क्योंकि वे एक समान फैशन में व्यवहार करते हैं। मुझे लगता है कि मुझे उम्मीद है कि [NSString string] एक स्थिर मूल्य देता है जिससे स्मृति में अनावश्यक स्ट्रिंग सृजन से परहेज किया जाता है। क्या कोई प्रकाश कुछ प्रकाश डाल सकता है क्योंकि दस्तावेज असंगत है।@ "बनाम [एनएसएसटींग स्ट्रिंग]

+0

बस नीचे दिए गए उत्तर में जोड़ने के लिए। एक बार शाब्दिक मूल्य @ "फू" संकलित हो जाता है। कोई अन्य @ "फू" अक्षर पहले संकेतक होगा। – RobCroll

उत्तर

5

यह काफी संभावना है कि @"" == [NSString string] और इसलिए निर्णय शैली की बात है। आह, यह नहीं है:

NSLog(@"%i", @"" == @""); // 1 
NSLog(@"%i", [NSString string] == [NSString string]); // 1 
NSLog(@"%i", [[NSString string] stringByAppendingString:@"foo"] == 
      [@"" stringByAppendingString:@"foo"]); // 1 
NSLog(@"%i", @"" == [NSString string]); // 0 

लेकिन मैं किसी भी उपयोग के मामले के बारे में सोच नहीं सकता जहां अंतर मायने रखता है।

+0

+1 * लेकिन * आपकी दूसरी पंक्ति ओपी की आशा साबित करती है। चौथा प्रासंगिक नहीं है (यहां)।'[एनएसएसटींग स्ट्रिंग] 'नींव के शाब्दिक या स्थिर लौटाता है, और' @ "" आपकी छवि द्वारा शाब्दिक निर्यात किया जाता है। यदि ओपी को पॉइंटर्स की तुलना करने की आवश्यकता होती है तो यह प्रासंगिक होगा, लेकिन इसकी आवश्यकता नहीं है। '@" "सबसे तेज़ होगा, लेकिन ज्यादातर लोग गति अंतर की परवाह नहीं करेंगे। यदि ओपी के पास बहुत स्ट्रिंग तुलना थी और पॉइंटर तुलना एक अच्छा फिट थी, तो '[एनएसएसटींग स्ट्रिंग]' का परिणाम तेजी से हो सकता है। – justin

+0

यदि चौथी पंक्ति सच थी, तो मुझे लगता है कि चर्चा अधिकतर मूक होगी, इसलिए मैंने इसे शामिल किया है। स्पष्टीकरण के लिए धन्यवाद! – zoul

+0

आह, ठीक है - और आपका स्वागत है। – justin

1

मुझे यकीन है कि [NSString string][[[NSString alloc] init] autorelease] के लिए बस एक सुविधाजनक तरीका है, जो कि semantics में @"" के समान है।

जिसका अर्थ है कि कोई स्मृति लाभ नहीं है।

2

@"" एक शाब्दिक स्ट्रिंग है और एप्लिकेशन के निष्पादन के दौरान मौजूद होगा। [NSString string] शायद गतिशील रूप से आवंटित ऑब्जेक्ट है (लेकिन इसे अनुकूलित नहीं किया जा सकता है) और इसलिए (सिद्धांत में) निष्पादन के दौरान एकत्र किया जा सकता है जब अब संदर्भित नहीं किया जाता है। दोनों शाब्दिक तार और गतिशील रूप से आवंटित दोनों आंतरिक रूप से साझा करते हैं, इसलिए दो @"" या दो [NSString string] एक ही ऑब्जेक्ट को वापस करने की संभावना है - भले ही एक ही फ़ाइल में न हो - लेकिन कोई गारंटी नहीं है कि वे करेंगे। हालांकि वे एक ही वस्तु को एक दूसरे के रूप में वापस नहीं कर सकते हैं।

कुल मिलाकर इससे कोई फर्क नहीं पड़ता, आपको स्ट्रिंग समानता परीक्षण के लिए पॉइंटर समानता पर भरोसा नहीं करना चाहिए।

असेंबली कोड को देखते हुए मुझे लगता है कि @"" में प्रदर्शन बढ़त है, लेकिन यह सोचना महत्वपूर्ण है कि वास्तव में समयपूर्व अनुकूलन का मामला है।

बस @"" का उपयोग करें, इसकी छोटी और स्पष्ट होने की योग्यता है।

+0

मुझे नहीं लगता कि रॉब पॉइंटर्स का उपयोग करके तारों की तुलना करना चाहता है, जो कि अलग-अलग स्ट्रिंग कन्स्ट्रक्टर के पीछे छुपा अनुकूलन को खोजने के लिए मेरा परीक्षण था। – zoul

0

@ "" एक निरंतर स्ट्रिंग है, इसलिए, शेष, -release, और -autorelease संदेशों को अनदेखा कर दिया जाता है। इसके अलावा इसे हटाया नहीं जा सकता है।
[एनएसएसटींग स्ट्रिंग] पहले से ही ऑटोरेलेज्ड है।

+2

'[एनएसएसटींग स्ट्रिंग] 'स्मृति प्रबंधन (ऐप्पल द्वारा वर्तमान कार्यान्वयन में) के संबंध में भी विशेष है, इसकी गिनती गिनती देखें। – zoul

+0

एआरसी के साथ क्या? – Supuhstar

0

यहां केवल एक चीज है जो मेरे लिए महत्वपूर्ण है: जो मैं उपयोग कर रहा हूं वह वास्तव में खाली स्ट्रिंग है। हर बार मुझे [NSString string] दिखाई देता है, मैं 0 के .length के साथ स्ट्रिंग प्राप्त करने के लिए 100% गारंटी देता हूं।

हालांकि, जब मैं @"" देखता हूं, तो मुझे 100% यकीन नहीं है कि यह खाली है। अब, 99.9 999%, यह एक सुरक्षित शर्त है, लेकिन यह आसानी से @"​" (zero-width space), backspace, zero-width non-joiner इत्यादि हो सकता है। उम्मीद है कि दुखद कोडर ने इसका इस्तेमाल किया था और कहा कि यह शून्य-चौड़ाई वाली जगह है, लेकिन बस इतना मेरा कोड इतना भ्रमित नहीं है, मैं [NSString string] का उपयोग करता हूं।

1

@ "" एनएसएसटींग खाली करने के लिए प्रयोग किया जाता है। स्ट्रिंग का उपयोग एनएसएमयूटेबल स्ट्रिंग को खाली करने के लिए किया जाता है।

NSString * string = @"String"; 
NSMutableString * mutablestring; 
[mutablestring setString:@"Mutable String"]; 

NSLog (@"%@", string);  // String 
NSLog (@"%@", mutablestring); // Mutable String 

string = @""; 
mutablestring = [NSMutableString string]; 

NSLog (@"%@", string);  // empty, nothing actually prints in NSLog 
NSLog (@"%@", mutablestring); // empty, nothing actually prints in NSLog 

//The below statement gives warning. 
mutablestring = @""; 
संबंधित मुद्दे