В 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;
}
Любое предложение будет оценено.