2012-04-19 8 views
9

मैं एक NSString के रूप में वस्तु चर घोषित लेकिन जब मैं XCode का उपयोग अपने वस्तु की जांच के लिए, मैंने देखा कि स्ट्रिंग के दो प्रकार के होते हैं, ऐसा लगता है कि सिस्टम दूसरा को स्थानांतरित:एनएससीएफस्ट्रिंग और एनएससीओन्स्टेंटस्ट्रिंग के बीच क्या अंतर है?

enter image description here

उनके बीच क्या अंतर है? क्या वे एक और दूसरों के लिए विचलित हैं। इसके अलावा, शर्त दो दूसरे में क्या बदलती है?

धन्यवाद।

+0

मैं UILabel चर के लिए Xcode डिबगर में __NSCFConstantString मनाया जब मैं दुर्घटना – sergtk

उत्तर

12

वे दोनों NSString के ठोस उपखंड हैं। __NSCFString फाउंडेशन या कोर फाउंडेशन के माध्यम से रनटाइम के दौरान बनाया गया है, जबकि __NSCFConstantString या तो CFSTR("...") निरंतर या @"..." स्थिर, संकलन-समय पर बनाया गया है।

उनके इंटरफेस निजी हैं। उन्हें NSString दोनों के साथ व्यवहार करें और आपको कोई परेशानी नहीं होनी चाहिए। tableView के लिए विधि cellForRowAtIndexPath में अगर आप

NSString *ident = @"identificator"; 
NSLog(@"%p", ident); 

लिखेंगे की तुलना में यह हर कोशिका के लिए एक ही पते होगा -

उदाहरण के लिए:

+8

द्वारा UILabel * करने के लिए NSString * सौंपा आप मुसीबत होगा यदि आप isKindOfClass साथ दो वस्तुओं की तुलना करने की कोशिश: यह केवल यदि __NSCFConstantString रिसीवर है काम करेंगे। सिर्फ उन लोगों के लिए एक सिर जो उपनिवेशों में से एक को जानना चाहते हैं, इसका तात्पर्य है। – fjlksahfob

+0

'-isKindOfClass: 'ऑब्जेक्ट तुलना के लिए उपयोग नहीं किया जाता है, इसलिए मुझे यकीन नहीं है कि आप यहां क्या प्राप्त कर रहे हैं। –

+2

अच्छी तरह से मैंने इसके लिए इसका इस्तेमाल किया ताकि इससे –

2

जहाँ तक मुझे पता है, NSCFConstantStringNSString का कार्यान्वयन है जो स्ट्रिंग डेटा को कोड मेमोरी में रखता है। जब आप @"string" स्थिरांक का उपयोग करते हैं तो कंपाइलर इसके उदाहरण बनाता है। आप NSCFConstantString का उपयोग कहीं भी NSString का उपयोग उपclass/superclass संबंधों के कारण किया जा सकता है, लेकिन स्पष्ट रूप से अन्य तरीकों से नहीं।

3

यह संकलक द्वारा किया गया एक अनुकूलन प्रतीत होता है। मैं अनुमान लगा रहा हूं कि NSCFConstantString में परिवर्तित होने वाली स्ट्रिंग प्रदर्शन कारणों से कैश किए गए स्थिरांकों में से एक के बराबर है। आपका NSCFString केवल एक टोल-फ्री ब्रिज स्ट्रिंग है जो NSString या CFString हो सकता है। अधिक जानकारी के लिए this article देखें।

0

NSCFConstantString को NSString बदलने के लाभों में से एक अगले उदाहरण है। लेकिन एनएसएलओजी (@ "% पी", & पहचान के साथ) यह प्रत्येक सेल के लिए अलग पता होगा।

NSString अध्यक्ष = @ "identificator" एक विशेष मामला है - यह एक __NSCFConstantString वर्ग के रूप में बनाया जाता है तो सभी को समान स्ट्रिंग शाब्दिक स्मृति के उपयोग का अनुकूलन करने के उसी स्मृति पता साझा करेगा। & पहचान को एक स्थानीय चर के पता मिलेगा जो एक NSString को इंगित करता है और NSString ** प्रकार होगा।

Reference स्रोत (टिप्पणियां) पर।

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