2011-08-23 6 views
11

Me devuelven un NSCFDiccionario y no sé cómo usarlo. Sé que es del tipo NSCFDictionary porque imprimí la clase y salió como __NCSFDictionary. No puedo entender cómo hacer algo con eso.¿Qué es un NSCFDiccionario?

sólo estoy tratando de aferrarse a él por ahora, pero no puedo conseguir que funcione:

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

La referencia de clase para allCredentials dice que su supone que devuelve un diccionario cuyos valores son también los diccionarios. Sin embargo, mi declaración de asignación no está funcionando. ¿Necesito un elenco de algún tipo?

Respuesta

26

NSDictionary y el otro collection classes son en realidad class clusters: varios subclases concretas clases que se hacen pasar bajo la interfaz de una sola clase: todos ellos proporcionan la misma funcionalidad (porque son subclases de la misma clase - en el caso de NSDictionary, esto implica los tres "métodos primitivos"-count, -objectForKey: y -keyEnumerator), pero tienen diferentes funciones internas para ser eficientes en diferentes situaciones, en función de cómo se crean y qué tipo de datos pueden estar almacenando.

NSCFDictionary es simplemente una subclase de NSDictionary. Es decir, sus NSDictionaries pueden ser realmente instancias de NSCFDictionary, pero debe tratarlos como instancias de NSDictionary, porque eso le proporcionará la funcionalidad de almacenamiento de diccionario requerida.

NSDictionary *value = [dict objectForKey:key];

Ahora, otra razón por la que su código no funciona: NSURLProtectionSpace es una clase, por lo que se debe utilizar como un puntero, así:

for (NSURLProtectionSpace *key ... 
+0

Intenté simplemente usar NSDictionary pero no compilaría. Tal vez sea un problema de Xcode – JPC

+0

¿Cuáles son exactamente los errores que obtienes al compilar? – jtbandes

+0

@JPC: encontré otro problema, vea mi respuesta actualizada. – jtbandes

5

NSCFDictionary es la subclase privada de NSDictionary que implementa la funcionalidad real. Es solo un NSDiccionario. Casi cualquier NSDictionary que utilice será un NSCFDiccionario bajo el capó. No le importa a tu código. Puede escribir la variable como NSDictionary y usarla en consecuencia.

+0

hmm entonces, ¿cómo es que esto no funciona ... NSDictionary * value = [dict objectForKey: key]; – JPC

+0

@JPC: Suponiendo que 'dict' contiene un puntero a un objeto que responde a' objectForKey: ', como otra instancia de NSDictionary (o de cualquier subclase de la misma), funciona bien. –

0

Tengo una NSCFDictionary que es en realidad un objeto NSMutableDictionary, puedo eliminar elementos de él. Menciono esto para aclarar aún más la respuesta de jtbandes: el objeto NSCFDictionary puede ser cualquier objeto que herede de NSDictionary.