6

我想CFStreamCreatePairWithSocketToHostNSInput- 和OutputStreams 一起使用。我有两个 ivarsNSInputStream *_inputStreamNSOutputStream *_outputStream.

以下给了我两个错误消息:

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

错误:ARC 不允许 将间接指针强制转换为指向“ ”的 Objective-C 指针(又名“ CFReadStreamRef *” )struct __CFReadStream **
CFWriteStreamRef *struct __CFWriteStream **

我将如何解决这个问题?我尝试使用__bridge,但收到类似的错误消息。

4

2 回答 2

4

传递一个指向实际变量CFReadStreamRefCFWriteStreamRef变量的指针,然后在分配给您的 NSType 时进行强制转换。基本上:

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

当然,您必须添加适当的桥接并为cfThing.

于 2012-01-12T11:40:20.607 回答
0

想想 ARC 在做什么,以及 __bridge cast 做什么:ARC 负责保留/释放 NSObject。__bridge casts 转移了该责任。例如,__bridge_retained 保留一个 NSString,将指针转换为 CFStringRef,并将执行匹配释放操作的责任交给使用 CFStringRef 的人。

不可能与指向 NSObject* 的指针或指向 Core Foundation ref 的指针一起使用。一个指针指向一个内存位置。任何类型的 NSObject* 或 Core Foundation 对象都可以存储在那里。

您需要两个变量,一个用于 NSInputStream*,一个用于 CFReadStreamRef。使用适当的桥接将 NSInputStream* 移动到 CFReadStreamRef。现在你有了你想要的,并且可以传递地址。

于 2014-03-14T21:31:31.410 回答