2009-11-08 6 views
0

NSURLConnection * connexion est une propriété de la classeNSURLConnection Fuites - Pourquoi?

@property (nonatomic, retain) NSURLConnection *connection; 

Instruments rapporte que je fuite un objet NSURLConnection dans la deuxième ligne du code ci-dessous.

NSURLRequest *request = [[NSURLRequest alloc] initWithURL:_url]; 
self.connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
[request release]; 

Dans les didFinishLoading et didFinishWithError sélecteurs de délégués, je libérer la connexion et la mise à zéro

[self.connection release]; 
self.connection = nil; 

J'ai lu le message "NSURLConnection leak?" et plusieurs autres. J'ai l'impression qu'il me manque quelque chose de totalement évident. Aidez-moi?

+0

étant donné que votre propriété est conservée, pourquoi ne libérez-vous pas la connexion immédiatement après l'avoir affectée à la propriété? – falstro

Répondre

3

Comme le dit le commentaire de Roe, vous allouez la connexion (retenez le compte 1), puis vous le conservez à nouveau avec votre propriété de connexion (en conservant le compte 2). Vous ne publiez qu'une seule fois dans les sélecteurs de délégué. Vous avez deux options:

1) Modifiez la propriété de votre connexion pour l'affecter plutôt que la conserver.

@property (nonatomic, assign) NSURLConnection *connection; 

// OR, since assign is the default you may omit it 

@property (nonatomic) NSURLConnection *connection; 

2) Libérer l'objet attribué après il est retenu par votre propriété de connexion:

NSURLRequest *request = [[NSURLRequest alloc] initWithURL:_url]; 
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
self.connection = connection; 
[connection release]; 
[request release]; 

Option 2 est préféré car il y a moins d'une chance de fuites depuis alloc et la libération sont aussi proches possible. En outre, si vous oubliez de libérer la connexion précédente, les méthodes synthétisées libéreront la précédente pour vous. N'oubliez pas de libérer self.connection dans dealloc.

+0

Merci beaucoup !! – TomH

+0

Oups, je voulais dire "comme l'ont dit les raves". Heureux de vous aider. –