写入后NSOutputStream与Bad Access崩溃(Objective-c)
发布时间:2020-12-16 09:47:51 所属栏目:百科 来源:网络整理
导读:我一直试图为我的iOS应用程序启动并运行一个基本的TCP客户端,但是遇到了一个我无法解决的问题. 到目前为止,我可以连接,发送一条消息,在服务器端收到,但随后我的应用程序崩溃. Client.h #import Foundation/Foundation.h@interface Client : NSObject NSStrea
我一直试图为我的iOS应用程序启动并运行一个基本的TCP客户端,但是遇到了一个我无法解决的问题.
到目前为止,我可以连接,发送一条消息,在服务器端收到,但随后我的应用程序崩溃. Client.h #import <Foundation/Foundation.h> @interface Client : NSObject <NSStreamDelegate> { NSInputStream *inputStream; NSOutputStream *outputStream; } -(void)initNetworkCommunication; -(void)send:(NSString*)message; @end Client.m #import "Client.h" @implementation Client - (void)initNetworkCommunication { CFReadStreamRef readStream; CFWriteStreamRef writeStream; CFStreamCreatePairWithSocketToHost(NULL,(CFStringRef)@"10.0.1.51",7769,&readStream,&writeStream); inputStream = ( NSInputStream *)CFBridgingRelease(readStream); outputStream = ( NSOutputStream *)CFBridgingRelease(writeStream); [inputStream setDelegate:self]; [outputStream setDelegate:self]; [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; [inputStream open]; [outputStream open]; } - (void)send:(NSString*)message { NSData *data = [[NSData alloc] initWithData:[message dataUsingEncoding:NSUTF8StringEncoding]]; [outputStream write:[data bytes] maxLength:[data length]]; } - (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent { NSLog(@"stream event %i",streamEvent); switch (streamEvent) { case NSStreamEventOpenCompleted: NSLog(@"Stream opened"); break; case NSStreamEventHasBytesAvailable: if (theStream == 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: NSLog(@"End Encountered!"); [theStream close]; [theStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; theStream = nil; break; default: NSLog(@"Unknown event"); } } @end 控制台中的输出是 2013-10-03 17:01:38.542 MMORPG[6076:70b] stream event 1 2013-10-03 17:01:38.543 MMORPG[6076:70b] Stream opened 2013-10-03 17:01:43.495 MMORPG[6076:70b] stream event 4 2013-10-03 17:01:43.495 MMORPG[6076:70b] Unknown event 好像,我的消息被发送,我接收流事件#4,然后我得到一个糟糕的访问崩溃.问题是我不知道它访问有什么问题? 任何帮助将不胜感激! 解决方法
问题是NSStream保持对其委托的assign / unsafe_unretained引用.如果在关闭和释放流之前释放了委托,则流将尝试在其现在取消分配的委托上调用方法,从而导致崩溃.解决方案是确保某个其他对象具有对客户端的强引用,防止其早期解除分配,或者确保在其委托被取消分配之前关闭并释放该流.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |