2010-01-29 4 views
5

Lorsque vous allouez et initialisez un objet, puis que vous souhaitez renvoyer cet objet, comment devez-vous le renvoyer?Gestion de la mémoire Objective-C (alloc et autorelease)

J'ai le code suivant:

NSXMLDocument* fmdoc = [[NSXMLDocument alloc] initWithContentsOfURL:trackInfoUrl 
    options:NSXMLDocumentTidyXML error:&err]; 
return [fmdoc autorelease]; 

Est-ce exact?

Répondre

4

C'est exact. Puisque vous initialisez l'objet, il est de votre responsabilité de le libérer ou de le libérer. Comme le nombre de retenues à la création est de 1 et que vous ne voulez pas qu'il soit supprimé avant que la méthode appelante n'ait la possibilité d'utiliser l'objet, autorelease est le bon message à envoyer.

Si vous l'aviez envoyé, la mémoire aurait été récupérée immédiatement. En l'envoyant autorelease la mémoire ne sera pas récupérée jusqu'à ce que le pool autorelease par défaut soit drainé, ce qui n'arrivera qu'après que la méthode appelante ait eu une chance de conserver l'objet si nécessaire.

+2

Correct, mais je déconseillerais toute mention de nombre de retenue spécifique car, à la création, le nombre de retenues peut être n'importe quel nombre en fonction des détails de mise en œuvre internes. Beaucoup plus constructif de penser à retenir compte comme quelque chose que vous ajoutez et soustrayez, mais ne jamais interroger la valeur directement. – bbum

+0

@bbum juste assez – mbarnett

+0

@bbum, commentaire étonnant, qui change ma façon de penser. –

Questions connexes