AsyncSocket EXC_BAD_ACCESS unrecognized selector sent to instance:0x6000001908e0

来源:互联网 发布:c语言间接寻址 编辑:程序博客网 时间:2024/06/14 09:33

一、问题


IOS使用AsyncSocket 会在下面代码处  报 EXC_BAD_ACCESS unrecognized selector sent to instance:0x6000001908e0



- (void)closeWithError:(NSError *)err

{

theFlags |=kClosingWithError;

if (theFlags &kDidStartDelegate)

{

// Try to salvage what data we can.

[selfrecoverUnreadData];

// Let the delegate know, so it can try to recover if it likes.

if ([theDelegaterespondsToSelector:@selector(onSocket:willDisconnectWithError:)])

{

[theDelegateonSocket:selfwillDisconnectWithError:err];

}

}

[selfclose];

}





二、debug 


1.  使用快捷键  command+I  打开 Xcode调试工具Instruments。


2.  双击打开下图Zombies 。






3. 点击红色按钮,开始诊断(然后操作模拟器,复现dump 问题),会弹出如下消息提示框。  点击绿色部分看到详细代码位置




三、解决办法


从debug 发现 封装的  MySocket 是僵尸对象。   故改为单例模式:


MySocket.h


@interface MySocket : NSObject

{

AsyncSocket *socket;

    

}

@property (nonatomic,strong)AsyncSocket  *socket;

+ (MySocket *)sharedSocket;

-(void)connectHost:(NSString *)host;



===========================================================================================


MySocket.m


@implementation MySocket

@synthesize socket=_socket;

+(MySocket *)sharedSocket

{ 

    staticMySocket *sharedInstace =nil;

    staticdispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        

        sharedInstace = [[selfalloc]init];

    });

    

    return sharedInstace;

}


-(void)connectHost:(NSString *)host{

    

    if (!self.socket) {

        

        self.socket = [[AsyncSocketalloc]initWithDelegate:self];

        NSError *err =nil;

        if(![self.socketconnectToHost:hostonPort:SOCKET_PORTerror:&err])

        {

            NSLog(@"Connect Error: %@", err);

        }else{

            NSLog(@"Connect success!");

        }

    }

    

}




阅读全文
0 0
原创粉丝点击