0

J'utilise ce code, mais lors du profilage, il me dit que j'ai beaucoup de fuites de mémoire dans les variables response_error, request et _response.HTTP Request Fuites de mémoire

J'ai essayé plusieurs endroits pour mettre un release code de chaque variable utilisée dans la fonction, mais il continue de s'écraser avec et sans message d'erreur aussi. (Le plus souvent il est EXC_BAD_ACCESS qui pointe à une erreur d'accès mémoire)

Je pense que ce pourrait être un problème de méthode NSURLConnection sendSynchronousRequest, mais je ne suis pas sûr.

Quelqu'un peut-il s'il vous plaît me donner un conseil ou placer release blocs à la place de ce code?

Merci

NSString *request_url = [NSString stringWithFormat:@"http://www.server.com/api/arg1/%@/arg2/%@/arg3/%@",self._api_key,self._device_id,self._token]; 
NSURL *requestURL = [NSURL URLWithString:request_url]; 
NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease]; 
[request setURL:requestURL]; 
NSError *response_error = [[NSError alloc] init]; 
NSHTTPURLResponse *_response = [[NSHTTPURLResponse alloc] init]; 
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:&_response error:&response_error]; 
NSString *str_response = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding]; 
return [[str_response JSONValue] valueForKey:@"pairing"]; 

où les variables sont définies comme

@interface MyClass : NSObject { 
    NSString *_device_id; 
    NSString *_token; 
    NSString *_api_key; 
} 
@property (nonatomic,retain) NSString *_device_id; 
@property (nonatomic,retain) NSString *_api_key; 
@property (nonatomic,retain) NSString *_token; 

Répondre

3

Vous fuyez _respone et response_error en les attribuant inutilement. Vous passez un pointeur vers votre pointeur vers une méthode qui va juste changer le pointeur créant une fuite. Aussi, vous devez AutoRelease str_response

NSError *response_error = nil; //Do not alloc/init 
NSHTTPURLResponse *_response = nil; //Do not alloc/init 
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:&_response error:&response_error]; 
NSString *str_response = [[[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding] autorelease]; 
return [[str_response JSONValue] valueForKey:@"pairing"]; 
+0

super, ça a marché comme un charme :) –

0

Si vous appelez alloc/init et puis ne pas appeler la libération ou autorelease, les chances sont que vous allez perdre la mémoire.

+0

, mais la question est où et comment placer ces blocs de libération, parce que 'bloc NSAutorelease' avec' drain' juste avant le retour n'a pas été la manipulation des fuites correctement, et mes communiqués par écrit la main a provoqué une erreur d'accès mémoire . –