2012-09-05 12 views
9

संभव डुप्लिकेट:
How to make an CFArrayRef to an NSMutableArrayCFArrayRef से NSArray को कैसे परिवर्तित करें?

मैं जानता हूँ कि इस सवाल के बारे में इतने सारे की जानकारी नहीं है, लेकिन हर एक जवाब हैं "इस आसान है, आप टोल फ्री पाटने के रूप में कास्ट कर सकते हैं। ", और फिर वास्तविक स्रोत कोड का कोई उल्लेख नहीं है। मुझे टोल-फ्री ब्रिज और कास्ट का मतलब पता है। मैं सटीक स्रोत कोड जानना चाहता हूं "CFArrayRef को NSArray में कैसे परिवर्तित करें?" । कोई भी कृपया !!!!!!

उत्तर

5

आप इसे कास्ट करने के लिए सक्षम होना चाहिए:

CFArrayRef *myLegacyArray = ... 

... 

NSArray *myArray=[(NSArray *)myLegacyArray copy]; 
+0

बहुत बहुत धन्यवाद! मैं अभी कोशिश करूँगा! – user1574429

+1

आपको इसे कॉपी करने की आवश्यकता नहीं है। एक टोल फ्री ब्रिज कास्ट सचमुच सिर्फ 'एनएसएआरएआरई * myNsArray = (NSArray *) myCfArray है; ' – jjv360

+0

जो केवल गैर-एआरसी कोड के लिए काम करता है। –

37

ठीक है, पहले आप अगर आप एआरसी या नहीं प्रयोग कर रहे हैं पता करने के लिए है, क्योंकि नियम थोड़ा बदल जाते हैं। इसके बाद, आपको यह जानना होगा कि आप वास्तव में अपनी कास्ट के साथ क्या करना चाहते हैं। क्या आप सिर्फ मूल्य का उपयोग करना चाहते हैं, या स्वामित्व स्थानांतरित करना चाहते हैं?

मैं एआरसी मानूंगा, क्योंकि, आईएमओ, सभी नए कोड वास्तव में एआरसी (और एआरसी है जहां कास्टिंग समस्याएं अधिक प्रचलित हैं) का उपयोग करना चाहिए।

CFArrayRef someArrayRef = ...; 
NSArray *array = (__bridge NSArray*)someArrayRef; 

ऊपर कोड एक NSArray* कि वर्तमान संदर्भ में इस्तेमाल किया जा सकता करने के लिए CF संदर्भ डाले। स्वामित्व का कोई हस्तांतरण नहीं हुआ है। someArrayRef अभी भी इसका संदर्भ रखता है, और आपको अभी भी someArrayRef जारी करना होगा या यह रिसाव होगा।

CFArrayRef someArrayRef = ...; 
NSArray *array = CFBridgingRelease(someArrayRef); 

इस कोड में, आपको न केवल एक कास्ट मिलता है, बल्कि स्वामित्व का हस्तांतरण होता है। someArrayRef अब संदर्भ नहीं रखता है, इसलिए इसे मैन्युअल रूप से रिलीज़ करने की आवश्यकता नहीं है। इसके बजाय, जब array रिलीज़ होता है, तो ऑब्जेक्ट डेलोक (अन्य स्थानों में कोई अन्य संदर्भ नहीं मानता)।

+0

ऐसा लगता है जैसे सीएफबीडिंग रिलाइज एआरसी पर्यावरण में जाने का तरीका है। हमेशा एनएस में स्थानांतरित करें ... और CFBridgingRelease का उपयोग करता है –

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