NSInputStream *
和CFReadStreamRef
之间的区别似乎是第一个是客观的C对象,而第二个是本机结构。尽管如此,它们还是免费桥接的。
我想实现一个基于网络流的程序。
-
[NSStream getStreamsToHost:port:inputStream:outputStream:] 产生
NSInputStream *
和NSOutputStream *
。但是,在 iOS 上,此方法不可用。因此,CFStreamCreatePairWithSocketToHost必须在iOS上使用。
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
情况下我不能这样做吗?什么时候应该使用哪种方法?
一般来说,大多数基金会/核心基金会免费桥接类在行为方面也是相似的。但你是对的,NSInputStream *
和CFReadStreamRef
的情况并非如此.Apple 的设置套接字流指南仅解释了您所描述的内容。即使使用最新的初始值设定项(如 10.6 中可用的inputStreamWithURL:
(,当url
是远程的(例如。 http://...
(。
我认为继续使用NSInputStream
的主要优势是在Objective-C应用程序中更好地集成。您可以随时尝试更改NSInputStream *
对象的属性(读取(,如下所示:
if (!CFReadStreamSetProperty((CFReadStreamRef)read,
kCFStreamPropertyShouldCloseNativeSocket,
kCFBooleanTrue))
failure("property change not accepted");
作为所有这些的替代方案,我建议查看 URL 加载系统编程指南中描述的NSURLRequest
和NSURLConnection
对象。