2010-07-23 7 views
3

J'ai un NSInputStream et un NSOutputStream dans une application iphone qui sont connectés à un serveur. Je suis capable de lire et d'écrire des données sur les prises sans problème. Le problème est que j'ai un bouton de déconnexion, et quand j'essaie d'appeler à proximité de l'un des flux, il bloque l'application. Je suppose que j'essaie d'appeler au mauvais moment, mais je ne suis pas sûr du bon moment.NSStream se ferme

Répondre

1

Vous devez vous assurer que vous demandez au calque sous-jacent de fermer le socket natif pour vous. Voici un code d'une de mes applications qui ne en réseau:

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

vous Très probablement n'a pas retenu votre flux d'entrée et de sortie après leur réception :) J'ai eu exactement le même problème, mais il m'a coûté beaucoup de temps à trouver la solution :)

+0

Ceci devrait être un commentaire pas une réponse ... –

0

Retenir le NSOutputStream résout mon problème, j'espère que cela aidera les autres. Les exemples de codes sont écrits avec ARC, ils n'ont donc plus besoin de les conserver mais si vous n'utilisez pas ARC, vous devez les conserver.

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