我想将CFStreamCreatePairWithSocketToHost
与NSInput
- 和OutputStream
一起使用。我有两个ivars NSInputStream *_inputStream
和NSOutputStream *_outputStream
。
以下给出了两条错误消息:
CFStreamCreatePairWithSocketToHost(NULL,
(__bridge_retained CFStringRef)self.hostname, self.port,
(CFReadStreamRef *)&_inputStream, (CFWriteStreamRef *)&_outputStream);
错误:不允许使用指向“
CFReadStreamRef *
”(又名“struct __CFReadStream **
”)的Objective-C指针的间接指针进行转换 错误:ARC不允许使用指向“CFWriteStreamRef *
”(又名“struct __CFWriteStream **
”)的Objective-C指针的间接指针
我该如何解决这个问题?我尝试使用__bridge
,但我收到了类似的错误消息。
答案 0 :(得分:4)
将指针传递给实际的CFReadStreamRef
和CFWriteStreamRef
变量,然后在分配到NSType时进行转换。基本上是:
CFThingRef cfThing = NULL;
CFFunctionGetThing(&cfThing);
NSThing * nsThing = cfThing;
当然,您必须添加适当的桥接演员,并为cfThing
执行所有适当的引用计数操作。
答案 1 :(得分:0)
想想ARC正在做什么,以及__bridge所做的事情:ARC负责保留/释放NSObject。 __bridge转移了这项责任。例如,__ bridge_retained保留NSString,将指针强制转换为CFStringRef,并将负责执行匹配的释放操作交给使用CFStringRef的人。
那个不可能使用指向NSObject *的指针或指向Core Foundation ref的指针。指针指向内存位置。任何类型的NSObject *或Core Foundation对象都可以存储在那里。
您需要两个变量,一个用于NSInputStream *,另一个用于CFReadStreamRef。使用适当的桥接强制转换将NSInputStream *移动到CFReadStreamRef。现在你有你想要的东西,并且可以传递地址。