AsyncSocket EXC_BAD_ACCESS unrecognized selector sent to instance:0x6000001908e0

一、问题


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:host onPort:SOCKET_PORTerror:&err])

        {

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

        }else{

            NSLog(@"Connect success!");

        }

    }

    

}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值