35 votes

Vérifier la taille d'un objet dans Objective-C

J'essaie de trouver la taille d'un objet objectif-c. J'utilise quelque chose de similaire à:

     NSLog(@"sizeof myObject: %ld", sizeof(*myObject));
 

Cela me donne juste la taille du pointeur cependant.

Qu'est-ce que je fais mal?

53voto

Jason Coco Points 52303

Tout ce que le compilateur connaît, c'est le pointeur, c'est pourquoi vous récupérez la taille du pointeur. Pour voir la taille de l'objet alloué, utilisez ceci:

 #import <malloc/malloc.h>

// ...

NSLog(@"size of myObject: %zd", malloc_size(myObject));
 

Mike Ash a une rédaction décente sur certains des éléments internes d'exécution Obj-C sur son blog Q&A: http://mikeash.com/?page=pyblog/friday-qa-2009-03-13-intro-to-the -objective-c-runtime.html

19voto

dreamlax Points 47152

Dans le runtime GNU Objective-C, vous pouvez utiliser (vous devez importer <objc/objc-api.h> :

 class_get_instance_size ([MyClass class]);
 

Sur Mac OS X, vous pouvez utiliser (vous devrez peut-être importer <objc/runtime.h> ):

 class_getInstanceSize ([MyClass class]);
 

Ces fonctions renverront la quantité de mémoire requise pour allouer un objet, elles n'incluront pas la mémoire allouée par un objet lors de son initialisation.

14voto

Ameer Sheikh Points 181

Tout d'abord, je pense qu'il est clair à partir de la création de ces postes que l' objet de la taille est donnée par malloc_size(monobjet), comme suggéré par Jason et aussi sur le système d'exploitation Mac manuel de référence:

"La malloc_size(ptr) la fonction retourne la taille du bloc de mémoire qui sauvegarde l'allocation pointé par ptr. La taille du bloc de mémoire est toujours au moins aussi grand que l'attribution dos, et peut-être plus." (http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/malloc_size.3.html)

Mais si vous êtes intéressé dans la recherche de la taille du dictionnaire, gardez à l'esprit les points suivants:

Le dictionnaire des magasins de paires clé-valeur et ne pas contenir de l'objet lui-même de la valeur de la partie, mais seulement des augmentations de conserver un nombre de l'objet qui devait être "ajouté", et maintient une référence de l'objet avec lui-même. Maintenant, le dictionnaire lui-même, tout contient les références vers les différents objets (avec une clé ci-joint). Donc, si par hasard, vous êtes à la recherche pour la taille de l'objet de tous les objets référés par le dictionnaire, techniquement, ce ne serait pas la taille du dictionnaire. La taille du dictionnaire serait la somme de la taille de toutes les touches, plus la taille de l'ensemble de la valeur des références à l'encontre de la touches, plus la taille de la mère de NSObject. Si vous êtes toujours intéressé à la recherche de la taille de l'référencé d'objets, essayez de parcourir le dictionnaire des valeurs de tableau:

NSArray *myArray = [myDictionary allValues];
id obj = nil;
int totalSize = 0;
for(obj in myArray)
{
    totalSize += malloc_size(obj);
}
//totalSize now contains the total object size of the refered objects in the dictionary.

Espérons que la réponse à la question.

7voto

Tilo Prütz Points 709

La taille d'un (objective-c) objet n'est pas facile à trouver car il n'est même pas facile à définir. Qu'avez-vous dire par "la taille de l'objective-c objet"?

La taille de la référence qui est de la taille d'un pointeur (retourné par sizeof(obj_ref)).

La taille de la mémoire qui a été allouée à la création (+alloc) peut être trouvé dans la voie que Jason a donné dans la première réponse. Mais cela dépend du moment de l'exécution. La gnu-exécution diffère de la pomme-de l'exécution. Finalement ce n'est que la mémoire est nécessaire pour les types de données primitifs de l'instance se compose de. Mais pas la mémoire qui peut être attribué plus tard (c'est à dire lors de l'initialisation (initialisation)) pour les objets référencés par le ivars ou de chaînes de caractères.

Une instance de la classe

@interface FirstClass
{
    int _someInt;
    char _someChar;
}
…
@end

besoin d'au moins 5 octets (sur beaucoup de systèmes, - int de la taille peut varier), plus statique surcharge si le moteur d'exécution a besoin d'elle. La taille d'un tel objet est évidente.

Mais pour une instance de la classe

@interface SecondClass
{
    FirstClass *_someObject;
    char *_name;
    id _data;
}
…
@end

la définition de la "taille" est compliqué. L'objet a besoin de 12 octets (sur 32 bits) pour les systèmes plus généraux sur la répartition. Mais peut-être que le nom fait partie de l'objet et du alloué/libérée par elle. Si la mémoire dont le nom doit être une partie de la taille de l'objet? Et ce sur les objets référencés?

5voto

EvilPenguin Points 297

Je suggère d'utiliser class_getInstanceSize et malloc_good_size pour voir ce que cela va arrondir. Cela ne montrera pas les ivars et ainsi de suite à l'intérieur de la taille retournée.

 #import <malloc/malloc.h>
#import <objc/runtime.h>

NSLog(@"Object Size: %zd", malloc_good_size(class_getInstanceSize([yourObject class])));
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X