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

Код выше не будет работать!