NSInputStream *
和CFReadStreamRef
之间的区别似乎是第一个是 objective-c 对象,而第二个是本机结构。然而,它们是免费的桥接。
我想实现一个基于网络流的程序。
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中描述的
NSURLRequest
和NSURLConnection
对象。