Iphone NSStream挂起关闭

Iphone NSStream挂起关闭,iphone,objective-c,nsstream,Iphone,Objective C,Nsstream,我有一个连接到服务器的iphone应用程序中的NSInputStream和NSOutputStream。我能够毫无问题地读写数据到套接字。问题是我有一个断开连接的按钮,当我尝试在任何一个流上调用close时,它会挂起应用程序。我猜我试图在错误的时间调用close,但我不确定什么是正确的时间。您必须确保告诉底层为您关闭本机套接字。以下是我的一个网络应用程序中的一些代码: ... CFReadStreamRef readStreamRef; CFWriteStreamRef writeStreamR

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

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

...
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;
    ...

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

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

NSOutputStream *outputStream = (NSOutputStream *)CFBridgingRelease(writeStream);
**[outputStream retain];**
[outputStream setDelegate:self];
[outputStream scheduleInRunLoop:[NSRunLoop mainRunLoop]
                                forMode:NSDefaultRunLoopMode];
[outputStream open];