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?
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?
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
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.
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.
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?
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 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.