Преобразование косвенного указателя на указатель Objective C на CFReadStreamRef запрещено с ARC

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

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

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

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

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

2 ответа

Решение

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

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

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

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

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

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