[英]iOS: outputStream does not stay open
好的,所以我正在實現NSOutput和Input Streams。 初始化后,流打開並連接到我在PC上運行的TCPServer,但是一旦在初始化功能之外出現,則流似乎關閉了,或者流沒有正確存儲。 我不太確定,因此非常感謝您的協助
在我的.h文件中:
@interface AVCamViewController : UIViewController <UIImagePickerControllerDelegate,UINavigationControllerDelegate, NSStreamDelegate> {
NSOutputStream *outputStream;
NSInputStream *inputStream;
}
@property (retain) NSInputStream *inputStream;
@property (retain) NSOutputStream *outputStream;
在我的.m文件中:
@synthesize inputStream, outputStream;
-(void)sendaResponse
{
NSString *response = [NSString stringWithFormat:@"Hello from Ipad Simulator"];
NSData *data = [[NSData alloc] initWithData:[response dataUsingEncoding:NSASCIIStringEncoding]];
[outputStream write:[data bytes] maxLength:[data length]];
NSLog(@"%u", outputStream.streamStatus);
}
-(void)initNetworkCommunication
{
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"10.9.100.122", 80, &readStream, &writeStream);
NSInputStream *inputStream = (NSInputStream *) readStream;
NSOutputStream *outputStream = (NSOutputStream *) writeStream;
[inputStream setDelegate:self];
[outputStream setDelegate:self];
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[inputStream open];
[outputStream open];
NSLog(@"%u and %u", inputStream.streamStatus, outputStream.streamStatus);
NSString *response = [NSString stringWithFormat:@"Hello from Mikes Ipad Simulator"];
NSData *data = [[NSData alloc] initWithData:[response dataUsingEncoding:NSASCIIStringEncoding]];
[outputStream write:[data bytes] maxLength:[data length]];
NSLog(@"%u", outputStream.streamStatus);
}
-(void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode
{
switch (eventCode) {
case NSStreamEventOpenCompleted:
NSLog(@"Stream Opened %u", outputStream.streamStatus);
break;
case NSStreamEventHasBytesAvailable:
if(aStream == inputStream)
{
uint8_t buffer [1024];
int len;
while ([inputStream hasBytesAvailable])
{
len = [inputStream read:buffer maxLength:sizeof(buffer)];
if(len>0)
{
NSString *output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSASCIIStringEncoding];
if(nil != output)
{
NSLog(@"Server said: %@", output);
}
}
}
}
break;
case NSStreamEventErrorOccurred:
NSLog(@"Can not connect to the host!");
break;
case NSStreamEventEndEncountered:
if(aStream == inputStream)
NSLog(@"Ending input stream");
if(aStream == outputStream)
NSLog(@"Ending output stream");
[aStream close];
[aStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[aStream release];
aStream = nil;
break;
default:
break;
}
}
在initNetworkConnection中,模擬器連接到我的TCPServer並打開一個連接(streamstatus = 2)。 收到消息“來自Ipad Simulator的Hello”。 但是然后我從按鈕單擊中調用了“ sendaResponse”方法,然后streamstatus = 0,“ outputstream”似乎沒有初始化。 我只是不能正確保留變量嗎?
我假設您正在使用ARC。 刪除此代碼:
{
NSOutputStream *outputStream;
NSInputStream *inputStream;
}
@synthesize inputStream, outputStream;
只是在屬性和實例變量之間使您感到困惑。 結果是,您直接設置實例變量,而流實例被ARC釋放。
相反,刪除上面的代碼后,請使用self.inputStream
和self.outputStream
訪問流。 這將使屬性正常工作,並確保遵守您配置的“保留”規范。
您的原始代碼也可能只是不嘗試設置屬性...您的配置應為:
NSInputStream *inputStream = (NSInputStream *) readStream;
NSOutputStream *outputStream = (NSOutputStream *) writeStream;
[inputStream setDelegate:self];
[outputStream setDelegate:self];
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[inputStream open];
[outputStream open];
self.inputStream = inputStream;
self.outputStream = outputStream;
然后將屬性更改為:
@property (strong) NSInputStream *inputStream;
@property (strong) NSOutputStream *outputStream;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.