NSInputStream *CFReadStreamRef之间的区别似乎是第一个是 objective-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 *转换为CFReadStreamRef才能设置此属性,然后还原转换以设置此类属性?
  • ...
  • NSInputStream *似乎有多个缺点。我可以提供它自己的子类,而在CFReadStreamRef情况下不能这样做,这是它唯一的优势吗?什么时候应该使用哪种方法?

    最佳答案

    通常,大多数Foundation / CoreFoundation免费电话桥接类在行为方面也相似。但是您是对的,NSInputStream *CFReadStreamRef并非如此。 Apple的Setting Up Socket Streams指南仅说明您所描述的内容。即使使用最新的初始化程序(如10.6中可用的inputStreamWithURL:),当url处于远程状态(例如http://...)时,它仍然不起作用。

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

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

    作为所有这些的替代方案,我建议看一看URL Loading System Programming Guide中描述的NSURLRequestNSURLConnection对象。

    08-27 15:31