一、问题
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 。
三、解决办法
从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!");
}
}
}