2009-06-20 7 views
0

J'ai deux classes, une classe qui gère la connectivité db et une classe d'entité. La classe db a une méthode d'instance appelée GetEntityByID: (int) entity_id. Cette méthode effectue une instruction select simple et crée une instance de classe Entity à l'aide d'une méthode init.Comment gérer la gestion de la mémoire dans cette situation?

Cela fonctionne très bien, cependant, quiconque appelle GetEntityByID doit se rappeler de le libérer. Puisque GetEntityByID n'est pas une méthode "init", cela ne semble pas correct. Comment gérer au mieux la gestion de la mémoire dans cette situation?

+0

Bonne question, et les réponses ci-dessous sont géniales. Juste une note de style: les noms de méthodes commencent généralement par une lettre minuscule, donc getEntityByID: serait préférable. Cela fonctionne cependant vous l'appelez, mais les conventions de codage peuvent aider à rendre le code plus maintenable. :-) –

Répondre

5

Vous pouvez appeler le autorelease dans votre méthode GetEntityID sur la classe pour libérer automatiquement l'instance si elle n'est pas conservée. Étant donné que l'instanciation de la classe est effectuée dans la méthode de votre classe de connectivité DB, l'objet renvoyé à l'instance ne la «possède» pas, c'est-à-dire votre classe de connectivité DB. A ce jour, selon convention, vous devez mémoire gérer l'instance:

Vous prenez possession d'un objet si vous créez à l'aide d'une méthode dont le nom commence par « alloc » ou « nouveau » ou contient « copie "(Par exemple, alloc, newObject ou mutableCopy) ou si vous lui envoyez un message" retain ". Vous êtes responsable de renoncer à la propriété des objets que vous possédez en utilisant la libération ou autorelease. Toute autre fois que vous recevez un objet, vous ne devez pas le libérer.

Si l'objet l'envoi de la méthode GetEntityID veut garder l'objet autour, par exemple si elle doit être utilisée comme une variable d'instance, peut alors être retenu l'objet retourné, l'empêchant d'être désallouée à la fin de l'événement actuel. Si elle n'est utilisée que localement, et n'a pas besoin d'être conservée après l'événement en cours, alors la classe n'a rien à faire; il sera libéré par le pool autorelease à la fin de l'événement en cours.

This article explique plus sur les pools autorelease.

0

Pour AutoRelease l'objet retourné dans GetEntityID faire quelque chose comme ça dans GetEntityID:

... // cool stuff in GetEntityID 
return [[entity_id retain] autorelease]; 
} 

Jetez un oeil à ce vraiment nice article expliquant la mémoire Objective-C mangement plus en détail.

+0

Je ne vois aucune raison pour que retenir pour être là, mais autorelease est la bonne réponse. – Chuck

+0

Oui, cela conserve] autorelease] n'est pas utile. La paire de retenue et autorelease est utilisée lorsque vous attendez la libération de la valeur d'origine dans un proche avenir et que vous souhaitez conserver la valeur de la variable jusqu'à ce que le pool de libération automatique soit supprimé. –

+0

Je voulais juste être du bon côté car je ne savais pas ce qui était fait pour la valeur de retour dans la méthode. – diederikh

Questions connexes