加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

写入后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引用.如果在关闭和释放流之前释放了委托,则流将尝试在其现在取消分配的委托上调用方法,从而导致崩溃.解决方案是确保某个其他对象具有对客户端的强引用,防止其早期解除分配,或者确保在其委托被取消分配之前关闭并释放该流.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读