AsyncSocket EXC_BAD_ACCESS unrecognized selector sent to instance:0x6000001908e0

客官°小女子只卖身不卖艺 2022-06-12 14:57 222阅读 0赞

一、问题

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。
  1. 双击打开下图Zombies 。

Center

![Image 1][]

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

![Image 1][]

Center 1

三、解决办法

从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

{

  1. staticMySocket \*sharedInstace = nil;
  2. staticdispatch\_once\_t onceToken;
  3. dispatch\_once(&onceToken, ^\{
  4. sharedInstace = \[\[selfalloc\] init\];
  5. \});
  6. return sharedInstace;

}

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

  1. if (!self.socket) \{
  2. self.socket = \[\[AsyncSocketalloc\] initWithDelegate:self\];
  3. NSError \*err =nil;
  4. if(!\[self.socketconnectToHost:host onPort:SOCKET\_PORTerror:&err\])
  5. \{
  6. NSLog(@"Connect Error: %@", err);
  7. \}else\{
  8. NSLog(@"Connect success!");
  9. \}
  10. \}

}

[Image 1]:

发表评论

表情:
评论列表 (有 0 条评论,222人围观)

还没有评论,来说两句吧...

相关阅读