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)])
{
[theDelegateonSocketerr];
}
}
[selfclose];
}
二、debug
- 使用快捷键 command+I 打开 Xcode调试工具Instruments。
- 双击打开下图Zombies 。
![Image 1][]
- 点击红色按钮,开始诊断(然后操作模拟器,复现dump 问题),会弹出如下消息提示框。 点击绿色部分看到详细代码位置
![Image 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
{
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!");
\}
\}
}
[Image 1]:
还没有评论,来说两句吧...