NSURLConnection sendSynchronousRequest с ARC
Я начинаю играть с ARC, и одним из первых экспериментов, которые я пытался, было сделать HTTP-вызов URL-адреса и вернуть некоторые данные. Конечно, код статуса HTTP очень важен для меня, поэтому я решил перейти к "goto" с помощью sendSynchronousRequest
, например:
NSError *error = [[NSError alloc] init];
NSHTTPURLResponse *responseCode = nil;
NSData *oResponseData = [NSURLConnection sendSynchronousRequest:request returningResponse:responseCode error:error];
С поддержкой ARC я получаю ошибки компилятора и предупреждения в этой последней строке.
Ошибки
Неявное преобразование указателя Objective-C в 'NSURLResponse * __ autoreleasing * 'запрещен ARC
Неявное преобразование указателя Objective-C в 'NSError * __ autoreleasing * 'запрещен ARC
file://localhost/Users/jason/Projects/test/Data/DataService.m: ошибка: Автоматическая ошибка подсчета ссылок: неявное преобразование Objective-C указатель на 'NSURLResponse * __ autoreleasing *' - запрещено ARC
file://localhost/Users/jason/Projects/test/Data/DataService.m: ошибка: Автоматическая ошибка подсчета ссылок: неявное преобразование Objective-C указатель на 'NSError * __ autoreleasing *' не разрешен ARC
Предупреждения
Несовместимые типы указателей, отправляющих 'NSHTTPURLResponse * _strong' to параметр типа "NSURLResponse" _autoreleasing * '
Несовместимые типы указателей, отправляющие 'NSError * _strong' в параметр type 'NSError * _autoreleasing *'
Из того, что я могу сказать, эта ссылка передается, но я не уверен, что правильный способ решить эту проблему. Есть ли "лучший" способ выполнить аналогичную задачу с ARC?
Ответы
Ответ 1
NSError *error = nil;
NSHTTPURLResponse *responseCode = nil;
NSURLRequest *request;
NSData *oResponseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&responseCode error:&error];
вы не указали ссылку на указатель ошибки/responceCode!
Ответ 2
Вы должны использовать тип (NSHTTPURLResponse __autoreleasing *) и тип (NSError __autoreleasing).
NSHTTPURLResponse __autoreleasing *response = nil;
NSError __autoreleasing *error = nil;
// request
NSData *result = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
И вы можете справиться с ними в следующем:
if (response){
// code to handle with the response
}
if (error){
// code to handle with the error
}
В противном случае вы не можете использовать ответ и ошибку в качестве глобальных vars. Если это так, они не будут работать правильно. По следам:
.h
NSHTTPURLResponse *__autoreleasing *response;
NSError *__autoreleasing *error;
.m
// request
NSData *result = [NSURLConnection sendSynchronousRequest:request returningResponse:response error:error];
Код выше не будет работать!