2011-03-05 17 views
11

Esto puede parecer una pregunta completamente estúpida, pero ¿cómo puedo obtener el tamaño en bytes de un NSDictionary? ¿Puedo convertirlo a NSData, y luego obtener la longitud de eso?Tamaño de bytes de un NSDictionary

¡Ayuda!

Respuesta

18

Deberías decir más acerca de por qué te preocupa el tamaño del diccionario en bytes, porque la respuesta puede ser diferente dependiendo.

En general, el "tamaño" de la huella de un NSDictionary en la memoria no es algo que pueda ver o preocuparse. Se abstrae su mecanismo de almacenamiento del programador, y utiliza algún tipo de sobrecarga más allá de los datos reales que está almacenando.

Sin embargo, puede serializar el diccionario a NSData. Si los contenidos del diccionario son solo tipos "primitivos" como NSNumber, NSString, NSArray, NSData, NSDictionary, puede usar la clase NSPropertyListSerialization para convertirla en una lista de propiedades binarias, que será la representación de bytes más compacta de sus contenidos. que se puede obtener:

NSDictionary * myDictionary = /* ... */; 
NSData * data = [NSPropertyListSerialization dataFromPropertyList:myDictionary 
    format:NSPropertyListBinaryFormat_v1_0 errorDescription:NULL];  
NSLog(@"size: %d", [data length]); 

Si contiene otros objetos personalizados, puede utilizar NSKeyedArchiver para archivar a un NSData, pero esto va a ser significativamente más grande y requiere la cooperación de las clases personalizadas.

+0

¡Gracias, funcionó de maravilla! La razón por la que lo estoy usando es para obtener el tamaño de los encabezados http enviados por [NSHTTPURLResponse allHeaderFields], y ver el tamaño de esos encabezados (tratando de monitorear el uso de la red) ... a menos que haya una mejor manera. – mootymoots

+0

La forma más directa de mirar el tráfico de la red es observar el tráfico de la red. :) Ejecutar un proxy web e inspeccionar el tráfico? Mire en Charles Proxy en el escritorio, o Wireshark o algo así. –

+0

'dataFromPropertyList: format: errorDescription:' está en desuso: primero se desaprobó en iOS 8.0 - Use dataWithPropertyList: format: options: error: en su lugar. – tdios

2

Usted puede obtener el tamaño de cualquier clase llamando esto:

#import "objc/runtime.h" 
int size = class_getInstanceSize([NSDictionary class]); 

Esto le devolverá el tamaño de la clase, pero no el tamaño real ocupado por un objeto instanciado. Si desea el tamaño de un objeto instanciado:

#import "malloc/malloc.h" 
int size = malloc_size(myObject); 
+4

Eso solo le da el tamaño de las variables de instancia de la instancia, no le da el tamaño de cualquier cosa que el objeto asigna ni hay ninguna manera de hacerlo. Tampoco funcionará para 'NSDictionary', ya que nunca hay una instancia de' NSDictionary' en su aplicación; solo instancias de subclases privadas. – bbum

Cuestiones relacionadas