2010-08-13 7 views
2

J'ai créé un programme simple pour tester les méthodes conserver/libération dans la gestion de la mémoire Objective-C. Comme je comprends de la gestion de la mémoire ObjC, je m'attends à ce qu'un objet avec retain count = 1 sur lequel j'appelle version obtienne le nombre de retenue décrémenté à zéro, puis relâché. Mais ce programme de test montrent que, après la première version, je reçois toujours retenir count = 1:Faire [Communiqué de obj] sur obj avec retainCount = 1 ne diminue pas retainCount à zéro

// TestClass.h 
#import <Cocoa/Cocoa.h> 
@interface TestClass : NSObject { 
} 
@end 

// TestClass.m 
#import "TestClass.h" 
@implementation TestClass 
@end 

// RetainRelease.m 
#import <Foundation/Foundation.h> 
#include "TestClass.h" 

void dumpRetain(id o); 

int main (int argc, const char * argv[]) { 
    TestClass *s = [[TestClass alloc] init]; 
    dumpRetain(s); 

    [s release]; 
    dumpRetain(s); 
} 

sortie:

2010-08-13 17:42:45.489 RetainRelease[20933:a0f] NSString - retain count=1 
2010-08-13 17:42:45.491 RetainRelease[20933:a0f] NSString - retain count=1 

Quelqu'un pourrait-il expliquer cela? Merci

Répondre

8

Pourquoi devrait-il décrémenter à zéro? Lorsque vous release un objet avec un nombre de retenue de 1, l'objet est détruit, de sorte qu'il n'a plus un retainCount. En tant que tel, pourquoi s'embêter à changer quelque chose à zéro quand il va disparaître quelques nanosecondes plus tard?

Aussi, ne pensent pas à des choses en termes de retainCount. Vous finirez par vous tuer par frustration. Au lieu de penser à "dois-je posséder cet objet? Si je le fais, puis-je abandonner correctement la propriété de cet objet quand j'en ai fini avec elle?"

Si vous pouvez répondre à ces questions correctement, alors c'est tout ce que vous devez faire.

+0

merci pour votre réponse. Je m'y attendais à décrémenter à zéro becouse de cette illustration: http://cocoadevcentral.com/images/articles/000094/learnobjectivec-referencecounting.png Avec ce code, je n'essayer de démontrer comment le comptage de référence fonctionne à un point abstrait de vue; Je suis d'accord avec vous sur le fait que penser à "dois-je posséder cet objet" est bien meilleur du point de vue de la programmation d'applications. – Max

+3

@Max Il est vrai qu'en y pensant en termes de "quand le retainCount frappe zéro, l'objet est désalloué", il est facile de comprendre ce qui se passe. Cependant, il est implémenté comme "quand l'objet est libéré avec un retainCount de 1, il est désalloué", car il n'est pas nécessaire de le décrémenter à 0. C'est une optimisation de l'implémentation. –

+0

je vous remercie pour votre clarification – Max

Questions connexes