Утечки памяти HTTP-запросов

Я использую этот код, но при профилировании он говорит мне, что у меня много утечек памяти в переменных response_error, request и _response.

Я пробовал несколько мест, чтобы поместить код release каждой переменной, используемой в функции, но он продолжает падать с сообщением об ошибке и без него. (чаще всего это EXC_BAD_ACCESS, что указывает на ошибку доступа к памяти)

Я думаю, что это может быть проблема метода NSURLConnection sendSynchronousRequest, но я не уверен.

Может кто-нибудь дать мне совет или разместить release блоков в правильном месте этого кода?

Спасибо

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"];

где переменные определены как

@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;

person Marek Sebera    schedule 01.08.2011    source источник


Ответы (2)


Вы теряете _respone и response_error, выделяя их без необходимости. Вы передаете указатель на свой указатель методу, который просто изменит указатель, создав утечку. Также вам нужно автоматически выпустить 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"];
person Joe    schedule 01.08.2011

Если вы вызываете alloc/init, а затем не вызываете release или autorelease, велика вероятность, что произойдет утечка памяти.

person Nathanial Woolls    schedule 01.08.2011
comment
но вопрос в том, где и как размещать эти блоки релиза, потому что блок NSAutorelease с drain прямо перед возвратом неправильно обрабатывал утечки, а мои релизы, написанные от руки, вызывали ошибку доступа к памяти. - person Marek Sebera; 01.08.2011