2

J'ai une classe pour la connexion avec httprequests. Je reçois une fuite de mémoire pour « NSMutableData » altho Je publie dans « didFailWithError » et « connectionDidFinishLoading » de l'objet de connexion:fuite de mémoire avec NSMutableData

- (BOOL)startRequestForURL:(NSURL*)url { 

[url retain]; 


NSMutableURLRequest* urlRequest = [[NSMutableURLRequest alloc] initWithURL:url]; 
// cache & policy stuff here 
[[NSURLCache sharedURLCache] removeAllCachedResponses]; 
[urlRequest setHTTPMethod:@"POST"]; 
[urlRequest setHTTPShouldHandleCookies:YES]; 
NSURLConnection* connectionResponse = [[[NSURLConnection alloc] initWithRequest:urlRequest delegate:self] autorelease]; 
if (!connectionResponse) 
{ 
    // handle error 
    return NO; 
} else { 
    receivedData = [[NSMutableData data] retain]; // memory leak here!!! 
} 

[url release]; 

[urlRequest release]; 


return YES;} 

- (void)connection:(NSURLConnection*)connection didFailWithError:(NSError*)error { 
UIAlertView *alert = 
[[[UIAlertView alloc] 
    initWithTitle:NSLocalizedString(@"Connection problem", nil) 
    message:NSLocalizedString(@"A connection problem detected. Please check your internet connection and try again.",nil) 

    delegate:self 
    cancelButtonTitle:NSLocalizedString(@"OK", nil) 
    otherButtonTitles:nil, nil] 
autorelease]; 
[alert show]; 

[connectionDelegate performSelector:failedAction withObject:error]; 
[receivedData release];} 

- (void)connectionDidFinishLoading:(NSURLConnection*)connection { 
[connectionDelegate performSelector:succeededAction withObject:receivedData]; 
[receivedData release];} 

Répondre

5

L'analyseur statique appellera cela un fuite parce que vous ne garantissez pas que l'une des méthodes comportant un release sera effectivement appelée.

Si vous définissez receivedData comme une propriété conservée, et faire

self.receivedData = [NSMutableData data]; 

Ensuite, dans votre dealloc (et aussi votre didFail et didFinish, au lieu de la libération):

self.receivedData = nil; 

Il vous sera D'ACCORD.

Comme jbat100 souligne, vous aussi une fuite de l'url et urlRequest si le! ConnectionResponse, sauf si vous avez omis ce code de la question

+0

Merci pour votre réponse. J'ai essayé votre solution et la fuite de mémoire est toujours là. (J'avais l'objet receicvedData dans le fichier .h avec retain.J'ai libéré dans dealloc et dans la connexion échouez/j'ai réussi le 'self.receivedData = nil;'. Je l'ai également initialisé comme vous l'avez dit: 'self.receivedData = [NSMutableData data]; 'En passant - mes tests sont dans les instruments xcode –

+0

Vous faites quelque chose avec receivedData ailleurs, pouvez-vous montrer ce code aussi? – jrturton

+0

Je l'utilise dans les méthodes de connexion:' [receivedData setLength: 0]; 'et' [receivedData appendData: données]; ' –

1

si vous voulez enlever cette fuite prendre NSURLConnection dans le fichier .h et la libération que dans la méthode connectionDidFinishLoading .reason vous y avez affecté l'objet NSURLConnection mais vous ne pouvez pas le libérer là-bas si l'application release tue là-bas. pourquoi vous devez créer un objet NSURLConnection dans .h

+0

Le NSURLConnection est autoeleased, ce n'est pas le problème. – jrturton

0

Pourquoi pensez-vous que vous fuit? (NSMutableData) Si c'est à cause de l'option Analyser de Xcode; Eh bien, il ment, car il ne peut pas gérer même ces situations complexes évidentes. Cependant, comme Narayana l'a fait remarquer, vous fuyez également la connexion, que vous devez libérer dans les deux méthodes, déléguer et échouer.

2

Vous devez vous assurer que ces deux méthodes de délégation sont le seul moyen possible de terminer la requête. Je peux voir une fuite ici

if (!connectionResponse) 
{ 
    // handle error 
    return NO; 
} 

vous ne faites pas les opérations de libération

[url release]; 
[urlRequest release]; 

que vous faites lorsque le connectionResponse est non nul. Sur une autre note, je suggère fortement la bibliothèque ASIHTTP Obj C pour faire ce genre de choses.

+0

Merci pour ça !!! –

+0

Merci !! Elle a résolu mes problèmes et fonctionne beaucoup plus vite –