2010-09-17 22 views
2

se référer à CGPointMake explaination needed?Gestion de la mémoire à propos CGPoint

-moi si je me trompe, dans la mise en œuvre de CGPointMake, CGPoint p; Déclarez une variable locale d'un struct, qui devrait devrait être libéré après avoir quitté le champ d'application. Mais pourquoi la fonction peut retourner la valeur sans risque?

De toute façon, supposons que l'implémentation de CGPointMake est correcte, devrais-je libérer le CGPoint créé par CGPointMake?

Répondre

7

Il n'a pas besoin d'être libéré, car il n'a jamais vécu sur le tas. Seule la mémoire allouée par tas doit être libérée. La mémoire qui est allouée sur la pile (comme c'est le cas dans CGPointMake()) sera nettoyée automatiquement après que la méthode/fonction existe. La fonction peut renvoyer un point parce que le compilateur voit "Aha, cette fonction veut retourner une structure, qui est sizeof(CGPoint) octets grand, donc je vais m'assurer qu'il y a assez d'espace dans la fente de mémoire de valeur de retour pour quelque chose qui gros." Ensuite, lorsque la fonction quitte, la valeur de retour est copiée dans l'emplacement de mémoire de retour, la fonction se termine et la valeur dans l'emplacement de retour est copiée vers sa nouvelle destination.

+2

Et en accord avec Apple convention de nommage, nous savons que nous n'avons pas besoin de le libérer parce qu'il n'a pas le mot "Créer" ou "Copier" dans le nom de la fonction (suivant la règle Créer). Apple utilise généralement Make dans les situations où la chose renvoyée est une structure, mais le plus important est d'apprendre la règle de création et la règle de gestion de la mémoire Cocoa équivalente (new, alloc, copy). –

0

La fonction peut renvoyer un CGPoint car la structure est "suffisamment petite" pour être renvoyée directement à partir d'une fonction. Vous ne renvoyez pas un pointeur, vous renvoyez le tout directement. Même avec des méthodes qui prennent CGPoints comme paramètres - vous pouvez passer le tout par valeur directement. Comme Dave le fait remarquer, les CGPoints ne sont pas des objets, ils ne sont que des struc- tures. CGPointMake ne "alloue" pas de mémoire. C'est juste une fonction qui retourne un struct mis en place avec les bonnes tailles, que vous capturez habituellement dans un local sur votre propre pile ou passez le long ou autre chose.

Comme tout type de primitif (int, float ou autre structure), il n'a pas besoin d'être libéré lorsqu'il sort de la portée. (Note: de nombreuses architectures/compilateurs/"interfaces binaires d'applications" ont des optimisations et des limites de taille en ce qui concerne la taille d'une chose utilisée comme argument ou valeur de retour. registre -bit (2x flotteurs de 32 bits) ce qui le rend plus lourd que de retourner un int. Mais le compilateur peut aussi faire d'autres trucs pour copier et écrire des structures plus grandes, par exemple CGRect.)

+0

thx pour ur ans mais je pense que celui de Dave DeLong est mieux –