Преобразование косвенного указателя на указатель Objective C на CFReadStreamRef запрещено с ARC
Я хочу использовать CFStreamCreatePairWithSocketToHost
с NSInput
- а также OutputStream
s. У меня есть два ивара 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. Теперь у вас есть то, что вы хотите, и можете передать адрес.