Подтвердить что ты не робот

Случайная ошибка синхронного запроса агента Mac OS X

В MacOS у нас есть агент, который реализует ARC, и это сделает некоторые запросы на сервер каждые 10 или 15 секунд в зависимости от настройки и работали без каких-либо проблем почти год, и всего пару недель назад приложение разбилось на одном компьютере с ошибка плохого доступа, особенно в этой строке:

[NSURLConnection sendSynchronousRequest:request returningResponse:&responseCode error:&error];

Версия Mac OS X, вызывающая проблемы, - 10.7.5, однако на других компьютерах с той же версией ОС работает нормально.

Мы используем синхронные запросы, так как это то, что нам нужно сделать но мы потратили некоторое время на асинхронные вызовы, но проблема сохраняется.

Итак, после просмотра других сообщений мы добавили политику кэширования: [request setCachePolicy: NSURLRequestReloadIgnoringCacheData]; избегать любых проблема с запросом на кеш. Приложение работает лучше, но все еще сбой обычно между 1500 и 1800 итерациями (30-40 минут), прежде чем он сработал от 15 до 20 итераций.

Рассмотрев другие вопросы в переполнении стека, мы попытались исправить это, используя ASIHTTPRequest, но опять-таки проблема произошла случайным образом (она может также произойти с ошибкой в ​​итерации # 2 или # 123x...).

Перед появлением ошибки запрос всегда работает правильно, мы получение данных и возможность работать с ним в обычном режиме.

Если включена опция NSZombieEnabled, мы не получаем никаких сообщений, когда приложение сбой, блок try/catch не работает для нас либо поскольку ошибка указывает на конкретную строку сверху;

[NSURLConnection sendSynchronousRequest:request returningResponse:&responseCode error:&error]

Это код, который мы должны сделать, используя NSURLConnection:

   NSMutableURLRequest *request = [[NSMutableURLRequest alloc]
   init]; [request setHTTPMethod:@"GET"]; [request setURL:[NSURL
   URLWithString:url]]; [request setTimeoutInterval: TIMEOUT];
   [request setCachePolicy: NSURLRequestReloadIgnoringCacheData];

    NSString *authenticationHeader = [NSString
    stringWithFormat:@"Basic %@", credentials]; [request
    addValue:authenticationHeader
    forHTTPHeaderField:@"Authorization"];

    NSError *error = nil; NSHTTPURLResponse *responseCode = nil;

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

    if([responseCode statusCode] != 200){ *hasError =[NSString
    stringWithFormat: @"Error getting %@, HTTP status code %li",
    [responseCode statusCode]]; return @"";
    }
    }
    return [[NSString alloc] initWithData:responseData
    encoding:NSUTF8StringEncoding];

И это код для ASIHttpRequest:

(NSString *)getDataFromURL: (NSString *)urlString withB64Credentials:(NSString *)credentials error:(NSString **)hasError
{
    NSString *response = @"";
    NSURL *url = [NSURL URLWithString:urlString];
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    [request setCachePolicy:ASIDoNotReadFromCacheCachePolicy];
    [request setTimeOutSeconds:TIMEOUT];

    NSString *authenticationHeader = [NSString stringWithFormat:@"Basic %@", credentials];
    [request addRequestHeader:@"Authorization" value:authenticationHeader];
    [request startSynchronous];

    NSError *error = [request error];
    if (!error)
        response = [request responseString];
    else
        NSLog(@"%@", [error description]);
    return response;
}

Любое предложение будет оценено.

4b9b3361

Ответ 1

Во-первых, код выглядит хорошо для меня.

Я бы сделал профиль памяти с инструментами, чтобы убедиться, что приложение не утечки памяти. Поскольку этот код, скорее всего, является самым назывным кодом вашего приложения, он также с большей вероятностью будет разбиваться там, если состояние приложения будет повреждено. Также вы должны протестировать свое оборудование по той же причине (http://osxdaily.com/2011/05/03/memtest-mac-ram-test/).

Также ваш код легко изолировать, чтобы вы могли сделать тестовое приложение, просто вызвав ваш URL-адрес или даже некоторые общедоступные URL-адреса. Если вы также можете запустить это приложение, у вас есть все, чтобы сообщить об ошибке в Apple.