2011-08-10 9 views
32

Mam kod (okrojona):Przesyłanie CFDictionaryRef do NSDictionary?

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

I wtedy pojawia się błąd:

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

Co robię źle? Jak przekonwertować z CFDictionaryRef na NSDictionary?

Odpowiedz

61

ARC zmieniło sposób, w jaki działa mostkowanie.

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

Jak miałoby to działa w drugą stronę? Jak w "make myNSDictionary" z "cfDict"? – johnluttig

+0

Próbowałem: 'currentListing = (__bridge NSDictionary *) currentListingRef;' i otrzymałem komunikat o błędzie: ** "Niezgodne typy rzutowania 'CFDictionaryRef *' (inaczej" const struct __CFDictionary ** ") na" NSDictionary * "z rzutem __bridge "** – johnluttig

+4

zaktualizował odpowiedź, jak przejść w obie strony. Problem z twoim kodem polega na tym, że masz CFDictionarRef *, CFDictionaryRef jest już typem wskaźnika. –

8

W ARC, należy to zrobić w ten sposób:

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

To uwalnia przedmiot CF i przenosi własność przedmiotu ARC inaczej należy zwolnić obiekt CF ręcznie.

+1

Właściwość CFBridgingRelease jest poprawna, zakładając, że "..." oznacza, że ​​utworzono/skopiowano CFDictionaryRef. Chociaż tak jest najprawdopodobniej, nie zawsze chcesz przenieść – feliun

0

Spróbuj tego kodu,

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