1

NSInputStream *和之间的区别CFReadStreamRef似乎是第一个是客观的 C 对象,而第二个是本机结构。然而,它们是免费桥接的。

我想实现一个基于网络流的程序。

  • [NSStream getStreamsToHost:port:inputStream:outputStream:]产生NSInputStream *NSOutputStream *. 但是,在 iOS 上,此方法不可用。

    因此,必须在 iOS 上使用CFStreamCreatePairWithSocketToHost 。

    CFReadStreamRef readStream;
    CFWriteStreamRef writeStream;
    CFStreamCreatePairWithSocketToHost(
                     kCFAllocatorDefault, host, port, &readStream, &writeStream);
    NSInputStream *read = (__bridge NSInputStream *)readStream;
    NSOutputStream *write = (__bridge NSOutputStream *)writeStream;
    
  • 设置流属性时,使用时并非所有属性都可用NSInputStream *。特别是kCFStreamPropertyShouldCloseNativeSocket确保在关闭相应的流时也关闭套接字会很有趣。

    我是否必须将 转换NSInputStream *为 aCFReadStreamRef才能设置此属性,然后还原转换以设置此类属性?

  • ...

NSInputStream *似乎有多个缺点。它的唯一优势真的是我可以提供它自己的子类,而在这种情况下我不能这样做CFReadStreamRef吗?什么时候应该使用哪种方法?

4

1 回答 1

2

一般来说,大多数 Foundation/CoreFoundation 免费桥接类在行为方面也相似。但你是对的,这不是 和 的NSInputStream *情况CFReadStreamRef。Apple 的设置套接字流指南仅解释了您所描述的内容。即使使用最新的初始化程序(如10.6 中可用的),它在远程inputStreamWithURL:时仍然不起作用(例如。 )。urlhttp://...

我认为继续使用的主要优势NSInputStream是在 Objective-C 应用程序中的更好集成。您可以随时尝试更改NSInputStream *对象的属性(读取),如下所示:

if (!CFReadStreamSetProperty((CFReadStreamRef)read,
                              kCFStreamPropertyShouldCloseNativeSocket,
                              kCFBooleanTrue))
     failure("property change not accepted");

作为所有这些的替代方案,我建议查看URL 加载系统编程指南NSURLRequest中描述的和NSURLConnection对象。

于 2012-08-15T15:41:05.943 回答