2011-08-10 3 views
32

Je le code (dépouillé):Casting un CFDictionaryRef à NSDictionary?

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

Et puis-je obtenir l'erreur:

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

Qu'est-ce que je fais mal? Comment convertir un CFDictionaryRef en un NSDictionary?

Répondre

61

L'ARC a changé la façon dont le pontage fonctionne.

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

Comment cela fonctionnerait dans l'autre sens? Comme dans, faites 'myNSDictionary' à partir de 'cfDict'? – johnluttig

+0

J'ai essayé: 'currentListing = (__bridge NSDictionary *) currentListingRef;' et a reçu l'erreur de: ** "Types incompatibles transtypant 'CFDictionaryRef *' (alias 'const struct __CFDictionary **') en 'NSDictionary *' avec une distribution __bridge "** – johnluttig

+4

mis à jour la réponse avec comment aller dans les deux sens. Le problème avec votre code est que vous avez CFDictionarRef *, CFDictionaryRef est déjà un type de pointeur. –

8

Dans ARC, cela devrait se faire de cette façon:

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

Cela libère l'objet des FC et transfère la propriété de l'objet à ARC sinon vous devez libérer l'objet CF manuellement.

+1

CFBridgingRelease est correct, en supposant que "..." signifie que vous avez créé/copié un CFDictionaryRef. Bien que ce soit le cas le plus probable, vous ne voulez pas toujours transférer – feliun

0

Essayez ce code,

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