使用ARC不允许使用指向'CFReadStreamRef *'的Objective-C指针的间接指针

时间:2012-01-12 11:33:28

标签: objective-c automatic-ref-counting core-foundation foundation multiple-indirection

我想将CFStreamCreatePairWithSocketToHostNSInput - 和OutputStream一起使用。我有两个ivars NSInputStream *_inputStreamNSOutputStream *_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,但我收到了类似的错误消息。

2 个答案:

答案 0 :(得分:4)

将指针传递给实际的CFReadStreamRefCFWriteStreamRef变量,然后在分配到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。现在你有你想要的东西,并且可以传递地址。