2011-08-10 55 views
32

我的代碼(精簡):將CFDictionaryRef投射到NSDictionary?

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

ARC改變了搭橋工程的方式。

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 *'(又名'const struct __CFDictionary **')轉換爲'NSDictionary *' 「** – johnluttig

+4

更新瞭如何去雙向的答案。你的代碼的問題是你有CFDictionarRef *,CFDictionaryRef已經是一個指針類型。 –

8

在ARC,應該這樣做是這樣的:

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

這釋放對象的CF對象和所有權轉移給ARC 否則你應該手動釋放CF對象。

+1

CFBridgingRelease是正確的,假設「...」表示您創建/複製了CFDictionaryRef。雖然這很可能是這種情況,但您並不總是希望轉移 – feliun

0

試試這個代碼,

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