2009-10-04 19 views
34

Tengo un NSMutableArray que contiene un montón de objetos, lo que estoy tratando de averiguar es cuánta memoria usa el array. Después de mirar un par de lugares sé el tamaño de la llamada, y cuando lo hago obtengo 32 bits (que es el tamaño del objeto NSMutableArray).Tamaño total del objeto NSMutableArray

código Ejemplo:

NSMutableArray *temp = [[NSMutableArray alloc]init]; 
[temp addObject:objectxyz]; 
[temp addObject:objectabc]; 
[temp addObject:object123]; 

ahora quiero saber el tamaño :)

Respuesta

5

No hay forma directa de hacerlo ya que todos los objetos se almacenan simplemente por referencia. No existe una noción concreta de "tamaño" en el cacao, especialmente debido a que los objetos pueden tener múltiples propietarios, lo que puede llevar a un doble recuento u otros problemas.

+4

De acuerdo. Usar '-count' le dirá cuántos objetos hay en la matriz, y puede multiplicar por el tamaño de un puntero para obtener una estimación aproximada, pero la matriz puede usar mucho más espacio (particularmente una matriz mutable) para que esto pueda a ser una predicción baja de todos modos. Dependiendo de cuál sea su objetivo, puede o no ser más útil que sumar los tamaños de las instancias que contiene. En general, estoy de acuerdo con @cobbal en que la propiedad múltiple complica las cosas y hace que sea menos importante conocer los tamaños exactos. Para arreglos grandes u objetos grandes, sí, pero como siempre, mida el rendimiento primero. :-) –

93

para obtener el número de objetos en la matriz, utilice

[temp count] 

Si desea que el uso de la memoria total de la matriz, que tendrá que recorrer y sumar la cantidad de memoria utilizada por cada objeto, pero no creo que un objeto genérico te dé su tamaño. Sin embargo, en general, no deberías preocuparte por el uso de la memoria.

2

Bueno, usted podría hacer algo como:

size_t total; 
id obj; 
for (obj in temp) 
    { 
    total += class_getInstanceSize([obj class]); 
    } 

pero eso no le dice exactamente la cantidad de almacenamiento de la matriz en realidad está utilizando, ya que puede crecer de forma dinámica y podría tener más memoria en cualquier dado un tiempo de lo que necesita solo para los objetos a los que apunta, y por supuesto tendría que tratar con cualquier colección recursivamente.

Si está tratando de hacerse una idea de cuánta memoria está usando, le sugiero que indague en los tutoriales de Instruments y conozca las sondas de uso de memoria que proporciona.

+0

La matriz en realidad solo contiene punteros al objeto, por lo que esto calcularía el tamaño agregado de los objetos almacenados en la matriz, pero no cuenta el objeto que aparece más de una vez y no le informará la memoria real consumida. por 'temp' en sí. –

7
size_t size = class_getInstanceSize([temp Class]); 
for (id obj in temp) { 
    size += class_getInstanceSize([obj Class]); 
} 

Tenga en cuenta que class_getInstanceSize se declara en /usr/include/objc/runtime.h

También tenga en cuenta que esto sólo se contará el tamaño de la memoria de los Ivars declarados en cada clase.

+0

Tiene prácticamente las mismas deficiencias que la respuesta de NSResponder. –

+0

Supongo que la pregunta es qué precisión necesita que tenga el resultado, y necesita funcionar en todos los casos para cualquier objeto posible.Si conoce el tipo de objetos que va a agregar a la matriz, es mucho más fácil determinar el uso de memoria. –

+0

Además, si está agregando matrices a matrices, puede resumir esos tamaños con llamadas recursivas a la función de suma para cualquier objeto que implemente NSFastEnumerator –

4

Si el NSArray, y todos los objetos que contiene, y todos sus subconjuntos (recursivamente etc.) responden a NSCoder, puede serializar la matriz en un fragmento de memoria NSData temporal, y luego obtener la memoria tamaño de ese objeto temporal plano.

Cuestiones relacionadas