Vérification de la taille d'un objet en Objective-C
J'essaie de trouver la taille de l'objective-c objet. Je suis l'aide de quelque chose de similaire à:
NSLog(@"sizeof myObject: %ld", sizeof(*myObject));
Qui me donne juste la taille du pointeur de la si.
Ce que je fais mal?
- Quel est le type de myObject?
- C'est un NSDictionary dans ce cas arbitraire quantités de clés et de valeurs.
- Probablement parce que NSDictionary est vraiment opaque de la poignée pour une complexe structure de données. Recherchez vos en-têtes (je n'ai pas de Mac à portée de main, désolé).
- C'est parce qu'un objet est en fait qu'une structure avec un pointeur vers l'objet de la structure de classe et c'est tout. Le moteur d'exécution en fait alloue de la mémoire pour un objet et expose ses données internes.
Vous devez vous connecter pour publier un commentaire.
Tous le compilateur sait, c'est le pointeur, qui est pourquoi vous obtenez la taille du pointeur de retour. Pour voir la taille de l'objet, utilisez l'un des extraits de code suivants:
Avec ARC:
Sans ARC:
Mike Ash a une bonne écriture-up sur certains de l'Obj-C runtime internes sur son Q&Un blog: http://mikeash.com/?page=pyblog/friday-qa-2009-03-13-intro-to-the-objective-c-runtime.html
NSLog(@"Size of %@: %zd", NSStringFromClass([myObject class]), malloc_size((__bridge const void *) myObject));
Dans la GNU Objective-C runtime, vous pouvez utiliser (vous devez importer
<objc/objc-api.h>
:Sur Mac OS X, vous pouvez utiliser (vous pourriez avoir besoin pour l'importation
<objc/runtime.h>
):Ces fonctions renvoient la quantité de mémoire est nécessaire pour allouer un objet, il ne comprendra pas la mémoire allouée par un objet lorsqu'il est initialisé.
Tout d'abord, je pense qu'il est clair à partir de la création de ces postes que l' objet 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 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:
Espère que cela répond à la question.
NSDictionary
met en œuvre sa clé avecNSCopying
protocole.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
a besoin d'au moins 5 octets (sur de nombreux systèmes -
int
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
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 conseille
class_getInstanceSize
etmalloc_good_size
pour voir ce que ça va arrondir à. Ce ne sera pas le ivars et autres joyeusetés retourné à l'intérieur de la taille.Je pense que la description de la classe contient la taille de l'information -- il est préférable de regarder ce que l'interrogation à l'aide de la
sizeof
opérateur.