2011-08-10 16 views
32

मैं कोड (नीचे छीन) हैNSDictionary को CFDictionaryRef कास्टिंग?

CFDictionaryRef *currentListingRef; 
//declare currentListingRef here 
NSDictionary *currentListing; 
currentListing = (NSDictionary *) currentListingRef; 

और फिर मैं त्रुटि मिलती है:

Cast of a non-Objective-C pointer type 'CFDictionaryRef *' (aka 'const struct __CFDictionary **') to 'NSDictionary *' is disallowed with ARC

क्या मैं गलत कर रहा हूँ? मैं CFDictionaryRef से NSDictionary पर कैसे परिवर्तित करूं?

उत्तर

61

एआरसी ने ब्रिजिंग कार्यों के तरीके को बदल दिया।

NSDictionary *original = [NSDictionary dictionaryWithObject:@"World" forKey:@"Hello"]; 
CFDictionaryRef dict = (__bridge CFDictionaryRef)original; 
NSDictionary *andBack = (__bridge NSDictionary*)dict; 
NSLog(@"%@", andBack); 
+0

यह कैसे काम अन्य तरीके से करेंगे? जैसा कि, 'cfDict' से 'myNSDictionary' बनाओ? – johnluttig

+0

मैंने कोशिश की: 'currentListing = (__bridge NSDictionary *) currentListingRef; 'और त्रुटि प्राप्त हुई: **" असंगत प्रकार कास्टिंग' CFDictionaryRef * '(उर्फ' कॉन्स स्ट्रक्चर __CFDictionary ** ') को' NSDictionary * 'से __bridge कास्ट के साथ "** – johnluttig

+4

ने दोनों तरीकों से कैसे जाना है इसका जवाब अपडेट किया। आपके कोड के साथ समस्या यह है कि आपके पास CFDictionarRef * है, CFDictionaryRef पहले से ही एक सूचक प्रकार है। –

8

एआरसी में, यह इस तरह से किया जाना चाहिए:

CFDictionaryRef currentListingRef = ...; 
NSDictionary *currentListing = CFBridgingRelease(currentListingRef); 

यह विज्ञप्ति चाप के लिए वस्तु के सीएफ वस्तु और स्थानान्तरण स्वामित्व अन्यथा आप सीएफ वस्तु मैन्युअल जारी करना चाहिए।

+1

CFBridgingRelease सही है, यह मानते हुए कि "..." का अर्थ है कि आपने CFDictionaryRef बनाया/कॉपी किया है। हालांकि यह मामला सबसे अधिक संभावना है, आप हमेशा हस्तांतरण नहीं करना चाहते हैं – feliun

0

इस कोड का प्रयास करें,

NSDictionary *ssidList = (__bridge NSDictionary*)myDict; 
NSString *SSID = [ssidList valueForKey:@"SSID"];