2011-08-23 23 views
11

我得到一個NSCFDictionary返回給我,我無法弄清楚如何使用它。我知道它是NSCFDictionary類型的,因爲我打印了這個類,它以__NCSFDictionary的形式出現。我無法弄清楚如何用它做任何事情。什麼是NSCFDictionary?

我只是想守住它,但現在甚至不能得到那個工作:

NSDictionary *dict = [[NSURLCredentialStorage sharedCredentialStorage] allCredentials]; 
    for(NSURLProtectionSpace key in [dict keyEnumerator]) 
    { 
     NSCFDictionary *value = [dict objectForKey:key]; 
    } 

爲allCredentials類參考說,它應該返回一本字典,其值也是字典。我的任務說明不起作用。我需要某種類型的演員嗎?

回答

26

的NSDictionary和其他collection classes實際上class clusters:幾個具體子類類的單一類的接口下的僞裝:它們都提供相同的功能(因爲它們是同一類的子類 - 在NSDictionary中的情況下,這涉及這三個「原始方法」-count,-objectForKey:-keyEnumerator),但是根據它們的創建方式以及它們可能存儲的數據類型,在不同情況下有不同的內部工作效率。

NSCFDictionary僅僅是NSDictionary的具體子類。也就是說,你的NSDictionaries實際上可能是NSCFDictionary實例,但你應該把它們當作NSDictionary的實例,因爲它會爲你提供所需的字典存儲功能。

NSDictionary *value = [dict objectForKey:key];

現在,另一個原因是你的代碼不起作用:NSURLProtectionSpace是一類,所以你應該把它作爲一個指針,就像這樣:

for (NSURLProtectionSpace *key ... 
+0

我嘗試使用NSDictionary,但它不會編譯。也許這是一個Xcode問題 – JPC

+0

編譯時得到的錯誤究竟是什麼? – jtbandes

+0

@JPC:我發現了另一個問題,請參閱我的更新答案。 – jtbandes

5

NSCFDictionary是實現實際功能的NSDictionary的私有子類。這只是一個NSDictionary。幾乎所有你使用的NSDictionary都是NSCFDictionary。你的代碼無關緊要。你可以輸入變量作爲NSDictionary並相應地使用它。

+0

嗯然後怎麼這不起作用... NSDictionary * value = [dict objectForKey:key]; – JPC

+0

@JPC:假設'dict'包含一個指向一個響應'objectForKey:'的對象的指針,比如NSDictionary的另一個實例(或者其任何子類),這個工作很好。 –

0

我有一個NSCFDictionary那實際上是一個NSMutableDictionary對象,我可以從它刪除項目。我提到這個以進一步闡明jtbandes的答案:NSCFDictionary對象可以是從NSDictionary繼承的任何對象。

相關問題