2009-03-12 15 views

उत्तर

331

एनएसएसटींग और सीएफस्ट्रिंगरफ "टोल फ्री ब्रिज" हैं, जिसका अर्थ है कि आप बस उनके बीच टाइपकास्ट कर सकते हैं।

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

CFStringRef aCFString = (CFStringRef)aNSString; 

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

NSString *aNSString = (NSString *)aCFString; 

पिछले वाक्य रचना एमआरसी के लिए किया गया था। आप एआरसी का उपयोग कर रहे हैं, तो नई कास्टिंग वाक्य रचना इस प्रकार है:

NSString *aNSString = (__bridge NSString *)aCFString; 

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

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

+85

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

+6

धन्यवाद MikeG, मैं रिवर्स रूपांतरण के लिए समान नहीं था: NSString * str = @ "abc"; CFStringRef cstrref = (__ पुल CFStringRef) str; – KomodoDave

+2

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

12

वे बराबर हैं, तो आप सिर्फ CFStringRef डाली कर सकते हैं:

NSString *aNSString = (NSString*)aCFString; 

अधिक जानकारी के लिए, Toll-Free Bridged Types देखते हैं।

3

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

जिसके परिणामस्वरूप कोड:

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

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

एप्पल http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/GarbageCollection/Articles/gcCoreFoundation.html से:

यह कोर फाउंडेशन और के बीच विषमता की सराहना करने के लिए महत्वपूर्ण है कोको-जहां बनाए रखने, रिहाई, और autorelease कोई-ऑप्स कर रहे हैं। इसके विपरीत

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

, एक वस्तु आपने पहले परिणाम होगा बनाए रखने का उपयोग कर बरकरार रखा है जारी करने के लिए CFRelease का उपयोग कर: अगर, उदाहरण के लिए, आप एक CFCreate ... रिहाई या autorelease के साथ संतुलित है, तो आप एक कचरा एकत्र वातावरण में वस्तु का रिसाव हो जाएगा एक संदर्भ गिनती अंडरफ्लो त्रुटि में।


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

2

मुझे एआरसी और सीएफएसट्रिंग की रखरखाव की गिनती के साथ कोई समस्या हो रही थी। एक मामूली चिमटा के साथ NilObjects जवाब का उपयोग मेरे लिए सही काम किया। मैंने अभी बनाए रखा उदाहरण उदा।आप मैक ओएस एक्स/उद्देश्य सी के हाल के संस्करणों में एआरसी का उपयोग कर रहे हैं, तो यह है असली आसान

CFStringRef CFstringFileName=(__bridge CFStringRef)NSstringFileName; 
0

आप इसे कास्ट करने के लिए है

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

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

14

:

CFStringRef cfstringRef = (__bridge_retained CFStringRef)aNsString; 
+1

मुझे यकीन नहीं है, लेकिन मुझे लगता है कि '(__bridge एनएसएसटींग *)' पर्याप्त है: 'CFBridgingRelease() 'के साथ बनाए रखने की गिनती बढ़ाने में कोई बात नहीं है। –

-3

आप इसका उपयोग कर सकते हैं: CFStringRef idc के साथ;

NSString *sId = [NSString stringWithFormat:@"%@", (NSString*)idc]; 
संबंधित मुद्दे