2009-04-28 6 views
2

Suite à this question J'ai fixé un tas de fuites de mémoire dans BEncoding.m (à l'origine de here)Que signifie "Fuite d'objet retourné", de Clang?

J'ai fixé toutes les fuites de mémoire évidentes, mais Clang a trouvé quatre bogues « fuite d'objet retourné », que je ne suis pas sûr comment trier:

Les messages complets/bits appropriés de code sont les suivants:

NSMutableData *data = [[NSMutableData alloc] init]; 

[1] Procédé retourne un objet Objective-C avec un 1 conserver comptage (référence posséder)

[...] 
snprintf(buffer, 32, "%lu:", [object length]); 
[data appendBytes:buffer length:strlen(buffer)]; 
[data appendData:object]; 
return data; 

[3] objet retourné à l'appelant comme référence possédante (seul conserver le nombre transféré à l'appelant)

Répondre

3

OK, afin d'élargir la réponse ci-dessus (merci de me mettre sur la bonne voie) ...

return [data autorelease] 

Vous avez attribué un objet, « données », et sont sur le point de retourner cet objet retour à l'appelant. La façon dont cela fonctionne dans Obj-C est qu'à un certain niveau de la pile d'appels, il y a un NSAutoreleasePool. Lorsque vous envoyez le message "autorelease" aux données, il s'ajoute à ce pool d'autorelease. Cela permet à l'appelant d'utiliser brièvement l'objet "data" (par exemple, sur la durée de la pile locale) sans avoir besoin d'appeler explicitement "release", et finalement, lorsque le pool d'autorelease "pop", les données seront libérées (sauf si quelqu'un appelle "retenir"). C'est plutôt intelligent.

Sucrée. Je pense que je viens de gagner ma ceinture verte dans la gestion de la mémoire Obj-C.

7

vous voulez:

return [données autorelease];

puisque vous le transmettez à l'appelant.

+0

+1. S'il vous plaît développer votre réponse. C'est un sujet TRÈS trouble et déroutant, et ce petit fil d'Ariane m'a presque permis de comprendre –