我无法初始化一个NSInputStream

请帮助我,即时疯狂。 我需要创build一个NSInputStream所以我可以通过wifi从相机读取实时预览。 liveViewStream是一个NSInputStream -Instance-Variable,在我的实现中声明如下:

 @implementation MKSonyCamHandler{ NSInputStream *liveViewStream; } 

liveViewURL是一个有效的URL,当我连接到摄像机的networking时,我可以在浏览器中打开它(尽pipe我不认为这有什么区别)。 我已经检查了它的存在,不是零,并保持我期望的价值。 但是当我这样做:

 liveViewStream = [[NSInputStream alloc] initWithURL:liveViewURL]; DLog(@"%@", liveViewStream); 

alloc-init命令后面的DLog每次都会logging“(null)”,如果我知道原因的话,那么该死的就不该说了。 有没有人遇到过这个? 我在这里丢失了明显的东西吗? 这是我第一次与NSStreams ,有没有一个常见的陷阱可能是原因? 该文档明确指出,-initWithURL:

 Creates and returns an initialized NSInputStream object that reads data from the file at a given URL. 

有任何想法吗? 我开始觉得这里真的很愚蠢。

编辑:我正在使用ARC。

谢谢大家,我发现它。

问题是,我的问题已经有了我所需要的所有线索,因为就像我写的,NSStream的-initWithURL:将

 Create and return an initialized NSInputStream object that reads data from the file at a given URL. 

我没有看到的是,这只对当地的来源是真实的。 如果你想要一个远程主机,(我有一个无线networking连接),你需要使用别的东西,因为,我在这里再次引用文档:

 The NSStream class does not support connecting to a remote host on iOS. 

那么,对于它的价值,你需要创build一个CFReadStreamRef和一个CFWriteStreamRef ,然后使用魔术函数CFStreamCreatePairWithSocketToHost将它们连接到你的主机。 之后,你可以将它们分别转换为NSInputStreamNSOutputStream ,并且按照预期工作。 下面是文档中的代码示例:

  CFReadStreamRef readStream; CFWriteStreamRef writeStream; CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)[website host], 80, &readStream, &writeStream); NSInputStream *inputStream = (__bridge_transfer NSInputStream *)readStream; NSOutputStream *outputStream = (__bridge_transfer NSOutputStream *)writeStream; [inputStream setDelegate:self]; [outputStream setDelegate:self]; [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; [inputStream open]; [outputStream open]; 

希望这可以帮助某个人。

@leparlon:

因为你是在正确的轨道上,我build议你的答案,build议使用initWithData。

如果您使用的是ARC,可能会解决这个问题:

编辑:首先下载到NSData可能会解决它

 NSInputStream *tempStream; NSData *tempData = [NSData dataWithContentsOfURL:@"Your Url"]; tempStream = [[NSInputStream alloc] initWithData:tempData]; liveViewStream = tempStream; DLog(@"%@", liveViewStream);