Соединение Objective-c Http - Авто-релиз без пула - просто утечка - PullRequest
1 голос
/ 04 октября 2011

У меня есть HTTP-метод подключения, как показано ниже:

request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:url]];
[request setHTTPMethod:method];
[request setValue:contentType forHTTPHeaderField:@"Content-Type"];
[request setValue:@"DataType" forHTTPHeaderField:dataType];

[request setValue:[NSString stringWithFormat:@"%d", [data length]] forHTTPHeaderField:@"Content-length"];
[request setHTTPBody:[data dataUsingEncoding:NSUTF8StringEncoding]];
[[NSURLConnection alloc] initWithRequest:request delegate:self];
response = nil;
NSError *error = [[NSError alloc] init];

NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
[request release];
result = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
responseCode = [response statusCode];

[error release];
if(responseCode == 200) {
    [self connectionCompletedHere];
}
else 
{
    [self connectionFailedHere];
}

Работает нормально, но я получаю консольные сообщения, такие как __NSAutoreleaseNoPool (): объект 0x62c3b80 класса NSURL автоматически освобожден без пула на месте - просто утечка.

используя инструмент утечки, я сузил его до 2 строк, которые вызывают утечки:

[[NSURLConnection alloc] initWithRequest:request delegate:self];

и

 NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

Что я делаю не так?

Заранее спасибо

1 Ответ

0 голосов
/ 04 октября 2011

Не размещать / инициализировать / выпускать NSError, это ссылочный параметр, просто объявить его и передать его адрес:

NSError *error;

переработанный код:

...
response = nil;
NSError *error;

NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
[request release];
result = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
responseCode = [response statusCode];

if(responseCode == 200) {
...
...