NSInputStream *和CFReadStreamRef的区别似乎在于,第一个对象是目标C对象,而第二个对象是本机结构。然而,他们是免费的桥梁。
我想实现一个基于网络流的程序。
NSInputStream *和NSOutputStream *。但是,在iOS上,此方法不可用。
因此,CFStreamCreatePairWithSocketToHost必须在iOS上使用。
CFReadStreamRef readStream;CFWriteStreamRef writeStream;CFStreamCreatePairWithSocketToHost( kCFAllocatorDefault,host,port,&readStream,&writeStream);NSInputStream *read = (__bridge NSInputStream *)readStream;NSOutputStream *read= (__bridge NSOutputStream *)writeStream;NSInputStream *时并非所有属性都可用。特别是当相应的流关闭时,确保套接字也被关闭是非常有趣的。
是否必须将NSInputStream *转换为CFReadStreamRef以设置此属性,然后还原转换,以设置此属性?NSInputStream *似乎有多个缺点。它唯一的优势是我可以提供它自己的子类,而在CFReadStreamRef情况下却不能这样做吗?什么时候应该使用哪种方法?
发布于 2012-08-15 15:41:05
一般来说,大多数基金会/核心基金会免费桥接类在行为上也是相似的。但你说得对,NSInputStream *和CFReadStreamRef的情况并非如此。苹果的设置套接字流指南只解释了你描述的内容。即使在使用最新的初始化器(如10.6版的inputStreamWithURL: )时,当url是远程的时,它仍然不能工作(例如。http://...)。
我看到继续使用NSInputStream的主要优点是在Objective应用程序中进行更好的集成。在任何时候,您都可以尝试更改NSInputStream *对象的属性,如下所示:
if (!CFReadStreamSetProperty((CFReadStreamRef)read,
kCFStreamPropertyShouldCloseNativeSocket,
kCFBooleanTrue))
failure("property change not accepted");作为所有这些的另一种选择,我建议看看NSURLRequest和NSURLConnection对象在URL加载系统编程指南中的描述。
https://stackoverflow.com/questions/10600638
复制相似问题