जवाबों:
NSString और CFStringRef "Toll free bridged" हैं, जिसका अर्थ है कि आप उनके बीच बस टाइपकास्ट कर सकते हैं।
उदाहरण के लिए:
CFStringRef aCFString = (CFStringRef)aNSString;
पूरी तरह से और पारदर्शी तरीके से काम करता है। इसी तरह:
NSString *aNSString = (NSString *)aCFString;
पिछला सिंटेक्स MRC के लिए था। यदि आप ARC का उपयोग कर रहे हैं, तो नया कास्टिंग सिंटैक्स इस प्रकार है:
NSString *aNSString = (__bridge NSString *)aCFString;
साथ ही काम करता है। ध्यान देने वाली महत्वपूर्ण बात यह है कि CoreFoundation अक्सर वस्तुओं को +1 संदर्भ काउंट्स के साथ लौटाएगा, जिसका अर्थ है कि उन्हें रिलीज़ करने की आवश्यकता है (सभी CF [टाइप करें] प्रारूप फ़ंक्शंस ऐसा करें)।
अच्छी बात यह है कि कोको में आप सुरक्षित रूप से उन्हें मुक्त करने के लिए ऑटोरेलिज़ या रिलीज़ का उपयोग कर सकते हैं।
यदि आप Mac OS X / Objective C के हाल के संस्करणों में ARC का उपयोग कर रहे हैं, तो यह वास्तविक आसान है:
NSString *happyString = (NSString *)CFBridgingRelease(sadString);
हालाँकि, जब आप NSString को टोल फ्री ब्रिज CFString को टोल फ्री करने का प्रयास करते हैं और इसे स्वतः ही CFBridgingRelease () में लपेटने की पेशकश करते हैं, तो Xcode खुशी से आपको चेतावनी देगा, जिसे आप स्वीकार कर सकते हैं और यदि आप विकल्प पर क्लिक करते हैं तो यह अपने आप ही आपको रैपर डालने देता है।
(__bridge NSString *)
है कि पर्याप्त है: रिटेन के साथ गिनती बढ़ाने में कोई मतलब नहीं है CFBridgingRelease()
।
वे बराबर हैं, इसलिए आप बस CFStringRef डाल सकते हैं:
NSString *aNSString = (NSString*)aCFString;
अधिक जानकारी के लिए, टोल-फ्री ब्रिजिड प्रकार देखें ।
असल में, आप को कोर फाउंडेशन की वस्तुओं पर कोको रिटेन, रिलीज, ऑटोरेलिज का उपयोग नहीं करना चाहिए। यदि आप गारबेज कलेक्शन (केवल मैक ओएस एक्स पर अभी के लिए) का उपयोग कर रहे हैं, तो वे रिटेन, रिलीज़, ऑटोरेलेज़ कॉल सभी नो-ऑप हैं। इसलिए मेमोरी लीक हो जाती है।
कोर फाउंडेशन और कोको के बीच विषमता की सराहना करना महत्वपूर्ण है - जहां बनाए रखने, जारी करने और ऑटोरेलिज़ नो-ऑप हैं। यदि, उदाहरण के लिए, आपके पास एक CFCreate संतुलित है ... रिलीज़ या ऑटोरेलिज़ के साथ, आप एक संग्रहित वातावरण में ऑब्जेक्ट को लीक करेंगे:
NSString *myString = (NSString *)CFStringCreate...(...);
// do interesting things with myString...
[myString release]; // leaked in a garbage collected environment
इसके विपरीत, CFRelease का उपयोग किसी वस्तु को जारी रखने के लिए किया जाता है, जिसे आपने पहले प्रयोग करके बनाए रखा है, जिसके परिणामस्वरूप एक संदर्भ गणना अंडरफ़्लो त्रुटि होगी।
पुनश्च: पीटर होसी के जवाब पर टिप्पणी करने के लिए प्रतीत नहीं हो सकता है - अपने खुद के अनावश्यक रूप से जोड़ने के लिए खेद है।
मैं जोड़ता हूँ कि आप न केवल CFString से NSString में केवल एक कास्ट के साथ जा सकते हैं, बल्कि यह दूसरे तरीके से भी काम करता है। आप CFStringCreateWithCString
संदेश को छोड़ सकते हैं , जो एक कम चीज है जिसे आपको बाद में जारी करने की आवश्यकता है। (CF Create
जहां कोको का उपयोग करता है वहां उपयोग करता हैalloc
, या तो रास्ता, आपको इसे जारी करने की आवश्यकता होगी।)
परिणामी कोड:
NSString *escapedString;
NSString *unescapedString = [(NSString *) CFXMLCreateStringByUnescapingEntities(NULL, (CFStringRef) escapedString, NULL) autorelease];
Youcan उपयोग: CFStringRef आईडीसी के साथ;
NSString *sId = [NSString stringWithFormat:@"%@", (NSString*)idc];