NSURLConnection sendSynchronousRequest с ARC - PullRequest
11 голосов
/ 03 января 2012

Я начинаю играть с ARC, и одним из первых экспериментов, которые я пытался сделать, было сделать HTTP-вызов URL-адреса и вернуть некоторые данные.Конечно, код статуса HTTP важен для меня, так что это означает, что я перешел к своему «использованию» использования 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: error: Automatic ReferenceПроблема с подсчетом: неявное преобразование указателя Objective C в NSURLResponse * __ autoreleasing * запрещено с файлом ARC

: //localhost/Users/jason/Projects/test/Data/DataService.m: error:Проблема автоматического подсчета ссылок: неявное преобразование указателя Objective C в 'NSError * __ autoreleasing *' запрещено с ARC

Warnings :

Несовместимый тип указателяотправка 'NSHTTPURLResponse * _ strong' параметру типа 'NSURLResponse * _autoreleasing *'

Несовместимые типы указателей, отправляющие 'NSError * _ strong' параметру типа 'NSError * _autoreleasing * '

Из того, что я могу сказать, передача ссылок заключается в том, что все портит, но я не уверен, каков правильный способ решения этой проблемы.Есть ли «лучший» способ выполнить аналогичную задачу с ARC?

Ответы [ 2 ]

23 голосов
/ 03 января 2012
  NSError *error = nil;
  NSHTTPURLResponse *responseCode = nil;

  NSURLRequest *request;

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

вы пропустили ссылку на указатель error / responseceCode!

2 голосов
/ 01 февраля 2012

Вы должны использовать тип (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
}

В противном случае вы не сможете использовать ответ и ошибку в качестве глобальных переменных. Если это так, они не будут работать правильно. Нравится следующее:

.h
NSHTTPURLResponse *__autoreleasing *response;
NSError *__autoreleasing *error;

.m
// request
NSData *result = [NSURLConnection sendSynchronousRequest:request returningResponse:response error:error];

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

...