Monday 15 February 2010

objective c - NSString to CFStringRef and CFStringRef to NSString in ARC? -


मैं NSString से CFStringRef < / कोड> एआरसी में? विपरीत दिशा, सीएफ़स्ट्रिंग आरएफ से NSString एआरसी में जाने के लिए भी?

मेमोरी लीक के बिना यह करने का सही तरीका क्या है?

आमतौर पर

  NSString * yourFriendlyNSString = (__ ब्रीज NSString *) yourFriendlyCFString;   

और

  सीएफ स्ट्रिंग रीफ आपकी फ्रैंडेली सीएफस्ट्रिंग = (__ब्र्री सीएफ स्ट्रिंगरफ) yourFriendlyNSString;   

अब, अगर आप जानना चाहते हैं कि क्यों __ पुल कीवर्ड है, तो आप इसका संदर्भ लें। वहां आपको मिलेगा:

__ पुल स्वामित्व के हस्तांतरण के बिना उद्देश्य-सी और कोर फाउंडेशन के बीच एक सूचक को स्थानांतरित करता है।

__ पुल / लंबित या CFBridgingRetain किसी कोर फाउंडेशन सूचक पर उद्देश्य-सी पॉइंटर को काटता है और इसके स्वामित्व को हस्तांतरित करता है आप।

__ bridge_transfer या CFBridgingRelease एक गैर-ऑब्जेक्टिव-सी पॉइंटर को ऑब्जेक्टिव-सी में ले जाता है और एआरसी को स्वामित्व स्थानांतरित करता है। एआरसी ऑब्जेक्ट के स्वामित्व को त्यागने के लिए उत्तरदायी है।

इसका मतलब है कि उपरोक्त मामलों में आप स्वामित्व को बदलने के बिना वस्तु कास्टिंग कर रहे हैं। इसका अर्थ है कि न तो मामले में आप तार की याददाश्त को संभालने के प्रभारी होंगे।

ऐसा भी हो सकता है कि आप किसी कारण से स्वामित्व हस्तांतरित करना चाहते हैं।

  - (शून्य) कहते हैं हाय {सीएफ स्ट्रिंग आरएफ आरएफ = सीएफ स्ट्रिंगकरेट विथ सी स्ट्रिंग (शून्य, "हैलो वर्ल्ड!", केसीएफ स्ट्रिंग एन्कोडिंग मैकर रोमन); NSString * aNSString = (__ ब्रीज NSString *) str; एनएसएलॉग (@ "% @", एएनएसएसटीिंग); CFRelease (एसटीआर); // आपको स्ट्रिंग जारी करना है क्योंकि आपने इसे 'Create' cf फ़ंक्शन के साथ बनाया है)   

इस स्थिति में आप CFRelease को सहेज सकते हैं कास्टिंग करते समय स्वामित्व को स्थानांतरित कर रहा है।

  - (शून्य) कहते हैं हाय {CFStringRef str = CFStringCreateWithCString (NULL, "हैलो वर्ल्ड!", KCFStringEncodingMacRoman); NSString * aNSString = (__bridge_transfer NSString *) स्ट्रिंग; // या वैकल्पिक रूप से NSString * aNSString = (NSString *) CFBridgingRelease (str); एनएसएलॉग (@ "% @", एएनएसएसटीिंग); }   

str का स्वामित्व स्थानांतरित कर दिया गया है, अत: अब एआरसी में प्रवेश करेगा और आपके लिए स्मृति जारी करेगा।

दूसरे पर जिस तरह से आप एक NSString * को एक सीएफ स्ट्रिंग का उपयोग करके एक __ ब्रिज / लंबित कास्ट कर सकते हैं, ताकि आप ऑब्जेक्ट के मालिक हो और आपको इसे

NSString → सीएफ स्ट्रिंग
 <हो सकता है   

इसे लपेटने के लिए CFRelease । > // स्वामित्व स्थानांतरित न करें आपको `CFRelease` CFStringRef str = (__bridge CFStringRef) स्ट्रिंग को कॉल करने की आवश्यकता नहीं होगी; // स्थानांतरण स्वामित्व (यानी एआरसी को रास्ते से बाहर निकालना)। ऑब्जेक्ट अब तुम्हारा है और आपको 'CFRelease` को कॉल करना होगा जब आप इसके साथ कर लेंगे CFFringRef str = (__bridge_retained CFStringRef) स्ट्रिंग // आपको `CFRelease` कॉल करना होगा

CFString → NSString
  // स्वामित्व स्थानांतरित न करें एआरसी रास्ते से बाहर रहता है, और यदि उचित है, तो आपको `एआरटी` पर` सीएफआरईईज़` को कॉल करना होगा (यह कैसे निर्भर करता है कि कैसे 'सीएफस्ट्रिंग' बनाया गया था) NSString * string = (__BR NSString *) str; // एआरसी को स्वामित्व हस्तांतरण एआरसी में किक और यह अब स्ट्रिंग ऑब्जेक्ट को जारी करने के प्रभारी है। आपको स्पष्ट रूप से `स्ट्रेट एनएसएसटीइंग * स्ट्रिंग = (__Bridge_transfer NSString *) str पर` सीएफआरईज़ेबल` नहीं करना होगा;    

No comments:

Post a Comment