2010-12-08 10 views
5
NSDictionary *dict = [NSDictionary dictionary]; 
NSLog(@"%@", NSStringFromClass([dict class])); 

Este código imprime "__NSDictionary0".¿Por qué NSDictionary informa un nombre de clase inusual?

Para mis propias clases, se imprime el nombre de clase real.

¿Por qué NSDictionary se identifica como __NSDictionary0 y es seguro depender de esto?

Respuesta

15

NSDictionary es un clúster de clase. Lea acerca de ellos aquí:

Cocoa Fundamentals Guide

medida que la clase "real" en sí es privado, no, es no segura a depender de esto.

Si lo que necesita saber si su clase es realmente una NSDictionary o no, utilice [dict isKindOfClass:[NSDictionary class]];

+4

Buena respuesta. Y si la siguiente pregunta es "Estoy tratando de determinar si un diccionario es mutable o no", entonces ... no ... tampoco puedes hacer eso. – bbum

+3

¿No podría usar 'isMemberOfClass: [NSMutableDictionary class]' para eso? – GendoIkari

+0

Sí, isMemberOfClass: se puede usar para determinar si un diccionario es mutable o no. – JustSid

20

NSDictionary es un conjunto de clases, como dijo Gendolkari y Class Clusters are documented.

Y, no, no puede depender de la identidad exacta de la subclase privada.

Por supuesto que debe ser capaz de hacer lo siguiente para determinar si se trata de un diccionario o no:

[myThingaMaHoover isKindOfClass: [NSDictionary class]]; 

O, al menos, que es un diccionario que implementa como una parte de la clase NSDictinoary racimo.

Lo que no puede hacer es usar isKindOfClass: o isMemberOfClass: para determinar si un diccionario (o cadena, matriz o conjunto) es mutable o no. Considerar:

NSDictionary *d = [NSDictionary dictionaryWithObject: [[NSObject new] autorelease] forKey: @"Bob"]; 
NSMutableDictionary *m = [NSMutableDictionary dictionaryWithObject: [[NSObject new] autorelease] forKey: @"Bob"]; 
NSLog(@"d class: %@ %@ %@", [d class], [d superclass], [[d superclass] superclass]); 
NSLog(@"m class: %@ %@ %@", [m class], [m superclass], [[m superclass] superclass]); 

Este salidas:

d class: NSCFDictionary NSMutableDictionary NSDictionary 
m class: NSCFDictionary NSMutableDictionary NSDictionary 

d y m son ambas instancias de NSCFDictionary que hereda de NSMutableDictionary (que hereda de NSDictionary).

+0

+1 para el ejemplo. – GendoIkari

1

Así que, básicamente, necesita saber si va a tener un NSMutableDictionary o un NSDictionary desnudo de antemano. O no necesita saber O crea un NSMutableDictionary desde tu objeto (NSDictionary o NSMutableDictionary)?

¿Para qué fue originalmente la pregunta?

0

Si desea probar la mutabilidad, la mejor opción sería probablemente conformsToProtocol: @protocol (NSMutableCopying)

+1

NSDictionary y NSArray confirman a NSMutableCopying. – Karmeye

0

Para una prueba mutabilidad NSDictionary, que podría't sólo para un 'respondsToSelector' de un método que sólo un NSMutableDictionary tendría, como addObject: ForKey :?

Cuestiones relacionadas