2009-08-28 11 views
1

Je libère des choses mais la mémoire semble toujours être là selon les instruments. Est-ce que je libère juste le pointeur et pas les données réelles? Comment puis-je publier THE DATA dans objective-c? Quelle est la différence entre [anObject release] ou [&anObject release]?Comment libérer la mémoire ACTUAL et pas seulement le pointeur vers la mémoire?

Veuillez excuser mon manque de connaissances sur le sujet de la mémoire et des pointeurs.

+0

Je ne pense pas "[& anObject release];" est même valable Objective-C. En supposant que "anObject" a un type de "NSObject *" ou "id", cela signifierait que "& anObject" serait un pointeur vers un pointeur vers un objet. – rpetrich

Répondre

6
[anObject release]; 

Plus précisément, vous dites l'objet à conserver son décrémenter nombre de 1. S'il arrive à tomber à zéro - ce qui ne peut pas, pour diverses raisons - l'environnement d'exécution Objective-C invoquera la méthode -dealloc qui appellera ensuite -release sur toutes les variables d'instance de type d'objet (et free() sur la mémoire malloc, le cas échéant).

Il n'y a pas de magie ici. release est juste un appel de méthode comme tout autre appel de méthode. Compte tenu de la question, je vous suggère de lire ceci:

http://developer.apple.com/IPhone/library/documentation/Cocoa/Conceptual/ObjectiveC/Introduction/introObjectiveC.html

Et, une fois que vous avez dissipé le mysticisme d'appeler des méthodes, lire pour comprendre la gestion de la mémoire sur l'iPhone:

http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html

+0

Oui, je vais lire la documentation. Merci – RexOnRoids

+0

Cool - le faire. Les guides conceptuels sont vraiment un endroit génial pour commencer. – bbum

1
[anObject release]; 

Indique l'objet à décrémenter son compte par retain 1. Chaque fois que vous alloc ou copy un objet, vous retournez un objet avec un retain nombre d'un. Ensuite, si vous le réappliquez, le nombre incrémente. Ou si vous utilisez une propriété de retenue, encore une fois, cela augmente. La libération d'appel, comme je l'ai dit, diminue ce nombre. Lorsque le compte atteint zéro, l'objet est envoyé dealloc qui (par des appels à [super dealloc]) libérera éventuellement toute la mémoire utilisée pour cet objet. Il y a aussi autorelease, mais je vais vous laisser le découvrir. Vous devriez lire le Memory Management docs. Étudie-les bien.

1

Généralement, les allocateurs de mémoire ne renvoient pas de mémoire au système d'exploitation immédiatement après la publication (ou même jamais). Ainsi, si l'instrumentation que vous regardez utilise des statistiques au niveau du système d'exploitation, l'utilisation ne diminuera pas même si vous avez libéré un objet alloué dynamiquement.

+0

Oh. Je ne le savais pas. J'utilise l'instrument de fuite de l'iPhone SDK et d'habitude je peux voir les graphiques des allocations d'objets (objets vivants) tomber immédiatement, mais dans ce cas c'est différent ... Que fait appel à [& anObject] BTW? – RexOnRoids

+0

Je ne sais pas. Je n'ai jamais écrit une ligne d'Objective-C dans ma vie. – Novelocrat

Questions connexes