CFStringRef को NSString में कैसे बदलें?


169
NSString *aNSString;
CFStringRef aCFString;
aCFString = CFStringCreateWithCString(NULL, [aNSString UTF8String], NSUTF8StringEncoding);
aCFString = CFXMLCreateStringByUnescapingEntities(NULL, aCFString, NULL);

मैं एक नए प्राप्त कर सकते हैं NSStringसे aCFString?

जवाबों:


349

NSString और CFStringRef "Toll free bridged" हैं, जिसका अर्थ है कि आप उनके बीच बस टाइपकास्ट कर सकते हैं।

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

CFStringRef aCFString = (CFStringRef)aNSString;

पूरी तरह से और पारदर्शी तरीके से काम करता है। इसी तरह:

NSString *aNSString = (NSString *)aCFString;

पिछला सिंटेक्स MRC के लिए था। यदि आप ARC का उपयोग कर रहे हैं, तो नया कास्टिंग सिंटैक्स इस प्रकार है:

NSString *aNSString = (__bridge NSString *)aCFString;

साथ ही काम करता है। ध्यान देने वाली महत्वपूर्ण बात यह है कि CoreFoundation अक्सर वस्तुओं को +1 संदर्भ काउंट्स के साथ लौटाएगा, जिसका अर्थ है कि उन्हें रिलीज़ करने की आवश्यकता है (सभी CF [टाइप करें] प्रारूप फ़ंक्शंस ऐसा करें)।

अच्छी बात यह है कि कोको में आप सुरक्षित रूप से उन्हें मुक्त करने के लिए ऑटोरेलिज़ या रिलीज़ का उपयोग कर सकते हैं।


88
आप एआरसी का उपयोग कर रहे हैं, तो इस मामले के लिए नए कास्टिंग वाक्य रचना अब NSString है * aNSString = (__bridge NSString *) aCFString
MikeG

6
धन्यवाद माइक जी, मुझे रिवर्स रूपांतरण के लिए समान करना था: एनएसएसटीरिंग * स्ट्र = = "एबीसी"; CFStringRef cstrref = (__ ब्रिज CFStringRef) str;
कोमोडोवेव

2
@NilObject ARC को शामिल करने के लिए कृपया अपने उत्तर को अपडेट करें ताकि खोजकर्ताओं को टिप्पणियों की जाँच करने की आवश्यकता न हो। धन्यवाद।
दान रोसेनस्टार्क

17

यदि आप Mac OS X / Objective C के हाल के संस्करणों में ARC का उपयोग कर रहे हैं, तो यह वास्तविक आसान है:

NSString *happyString = (NSString *)CFBridgingRelease(sadString);

हालाँकि, जब आप NSString को टोल फ्री ब्रिज CFString को टोल फ्री करने का प्रयास करते हैं और इसे स्वतः ही CFBridgingRelease () में लपेटने की पेशकश करते हैं, तो Xcode खुशी से आपको चेतावनी देगा, जिसे आप स्वीकार कर सकते हैं और यदि आप विकल्प पर क्लिक करते हैं तो यह अपने आप ही आपको रैपर डालने देता है।


3
मुझे यकीन नहीं है, लेकिन मुझे लगता (__bridge NSString *)है कि पर्याप्त है: रिटेन के साथ गिनती बढ़ाने में कोई मतलब नहीं है CFBridgingRelease()
C --ur


4

असल में, आप को कोर फाउंडेशन की वस्तुओं पर कोको रिटेन, रिलीज, ऑटोरेलिज का उपयोग नहीं करना चाहिए। यदि आप गारबेज कलेक्शन (केवल मैक ओएस एक्स पर अभी के लिए) का उपयोग कर रहे हैं, तो वे रिटेन, रिलीज़, ऑटोरेलेज़ कॉल सभी नो-ऑप हैं। इसलिए मेमोरी लीक हो जाती है।

Apple से http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/GarbageCollection/Articles/gcCoreFoundation.html :

कोर फाउंडेशन और कोको के बीच विषमता की सराहना करना महत्वपूर्ण है - जहां बनाए रखने, जारी करने और ऑटोरेलिज़ नो-ऑप हैं। यदि, उदाहरण के लिए, आपके पास एक CFCreate संतुलित है ... रिलीज़ या ऑटोरेलिज़ के साथ, आप एक संग्रहित वातावरण में ऑब्जेक्ट को लीक करेंगे:

NSString *myString = (NSString *)CFStringCreate...(...);
// do interesting things with myString...
[myString release]; // leaked in a garbage collected environment

इसके विपरीत, CFRelease का उपयोग किसी वस्तु को जारी रखने के लिए किया जाता है, जिसे आपने पहले प्रयोग करके बनाए रखा है, जिसके परिणामस्वरूप एक संदर्भ गणना अंडरफ़्लो त्रुटि होगी।


पुनश्च: पीटर होसी के जवाब पर टिप्पणी करने के लिए प्रतीत नहीं हो सकता है - अपने खुद के अनावश्यक रूप से जोड़ने के लिए खेद है।


3

मैं जोड़ता हूँ कि आप न केवल CFString से NSString में केवल एक कास्ट के साथ जा सकते हैं, बल्कि यह दूसरे तरीके से भी काम करता है। आप CFStringCreateWithCStringसंदेश को छोड़ सकते हैं , जो एक कम चीज है जिसे आपको बाद में जारी करने की आवश्यकता है। (CF Createजहां कोको का उपयोग करता है वहां उपयोग करता हैalloc , या तो रास्ता, आपको इसे जारी करने की आवश्यकता होगी।)

परिणामी कोड:

NSString *escapedString;
NSString *unescapedString = [(NSString *) CFXMLCreateStringByUnescapingEntities(NULL, (CFStringRef) escapedString, NULL) autorelease];

2

मैं एआरसी के साथ एक मुद्दा रहा था और सीएफस्ट्रीम की गिनती बरकरार थी। NilObjects के उत्तर का उपयोग करते हुए एक मामूली ट्वीक ने मेरे लिए सही काम किया। मैंने अभी-अभी बरकरार रखा है उदा।

CFStringRef cfstringRef = (__bridge_retained  CFStringRef)aNsString;


-3

Youcan उपयोग: CFStringRef आईडीसी के साथ;

NSString *sId = [NSString stringWithFormat:@"%@", (NSString*)idc];
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.