3

我在连接到服务器的 iphone 应用程序中有一个 NSInputStream 和一个 NSOutputStream 。我能够毫无问题地读取和写入数据到套接字。问题是我有一个断开按钮,当我尝试在任何一个流上调用 close 时,它​​都会挂起应用程序。我猜我试图在错误的时间关闭,但我不确定正确的时间是什么时候。

4

3 回答 3

2

很可能您在收到输入和输出流后没有保留它们 :) 我遇到了完全相同的问题,但我花了很多时间来找到解决方案 :)

于 2011-05-03T13:34:33.637 回答
1

您必须确保告诉底层为您关闭本机套接字。这是我的一个网络应用程序中的一些代码:

...
CFReadStreamRef readStreamRef;
CFWriteStreamRef writeStreamRef;

CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)host, port, &readStreamRef, &writeStreamRef);

if (readStreamRef && writeStreamRef)
{
    CFReadStreamSetProperty(readStreamRef, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue);
    CFWriteStreamSetProperty(writeStreamRef, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue);

    inputStream = (NSInputStream*)readStreamRef;
    outputStream = (NSOutputStream*)writeStreamRef;
    ...
于 2010-07-23T16:00:30.883 回答
0

保留 NSOutputStream 解决了我的问题,希望对其他人有所帮助。示例代码是用 ARC 编写的,因此它们不再需要保留,但是如果您不使用 ARC,则必须保留。

NSOutputStream *outputStream = (NSOutputStream *)CFBridgingRelease(writeStream);
**[outputStream retain];**
[outputStream setDelegate:self];
[outputStream scheduleInRunLoop:[NSRunLoop mainRunLoop]
                                forMode:NSDefaultRunLoopMode];
[outputStream open];
于 2012-12-05T08:57:33.667 回答