Преобразование косвенного указателя на указатель Objective C на 'CFReadStreamRef *' запрещено с ARC - PullRequest
6 голосов
/ 12 января 2012

Я хочу использовать CFStreamCreatePairWithSocketToHost с NSInput - и OutputStream с.У меня есть два ivars NSInputStream *_inputStream и NSOutputStream *_outputStream.

. Следующее дает мне два сообщения об ошибке:

CFStreamCreatePairWithSocketToHost(NULL,
  (__bridge_retained CFStringRef)self.hostname, self.port,
  (CFReadStreamRef *)&_inputStream, (CFWriteStreamRef *)&_outputStream);

error: приведение косвенного указателя на Objective-Cуказатель на 'CFReadStreamRef *' (он же 'struct __CFReadStream **') не разрешен с ошибкой ARC
: приведение косвенного указателя на указатель Objective C на 'CFWriteStreamRef *' (он же 'struct __CFWriteStream **')запрещено ARC

Как бы это исправить?Я попытался использовать __bridge, но я получил похожие сообщения об ошибках.

Ответы [ 2 ]

4 голосов
/ 12 января 2012

Передайте указатель на действительные переменные CFReadStreamRef и CFWriteStreamRef, а затем приведите их при присваивании вашим NSTypes.В основном:

CFThingRef cfThing = NULL;
CFFunctionGetThing(&cfThing);
NSThing * nsThing = cfThing;

Конечно, вам нужно будет добавить соответствующий бросок моста и выполнить все соответствующие операции подсчета ссылок для cfThing.

0 голосов
/ 15 марта 2014

Подумайте о том, что делает ARC, и что делают __bridge-броски: ARC берет на себя ответственность за сохранение / освобождение объектов NSO. __bridge заставляет передать эту ответственность. Например, __bridge_retained сохраняет NSString, приводит указатель к CFStringRef и передает ответственность за выполнение соответствующей операции освобождения тому, кто использует CFStringRef.

То, что не может работать с указателем на NSObject * или указателем на базовую ссылку ref. Указатель указывает на область памяти. Любой объект NSObject * или Core Foundation может храниться там.

Вам нужны две переменные, одна для NSInputStream * и одна для CFReadStreamRef. Используйте соответствующее приведение моста, чтобы переместить NSInputStream * в CFReadStreamRef. Теперь у вас есть то, что вы хотите, и можете передать адрес.

...