概述
最近在做POS刷卡,报文是采用TCP传输,用的是AsyncSocket 三方库传输的字节流。
遇到的一个问题就是在release环境下,AsyncSocket 请求会直接崩溃。试了各种办法,最后找到了解决方法,在这里分享给大家。
首先崩溃的地方是
- (void)doStreamOpen
{
if ((theFlags &kDidCompleteOpenForRead) && (theFlags &kDidCompleteOpenForWrite))
{
NSError *err =nil;
// Get the socket
if (![selfsetSocketFromStreamsAndReturnError: &err])
{
NSLog (@"AsyncSocket %p couldn't get socket from streams, %@. Disconnecting.",self, err);
[selfcloseWithError:err];
return;
}
// Stop the connection attempt timeout timer
[selfendConnectTimeout];
if ([self.theDelegaterespondsToSelector:@selector(onSocket:didConnectToHost:port:)])
{
[self.theDelegateonSocket:selfdidConnectToHost:[selfconnectedHost] port:[selfconnectedPort]];
}
// Immediately deal with any already-queued requests.
[selfmaybeDequeueRead];
[selfmaybeDequeueWrite];
}
}
由于是提示的是内存地址原因,我想了想可能是没在主线程中运行,所以我在调用这个方法的地方在主线程中执行。
在这里我搜索了一下调用这个方法(doStreamOpen)的地方,修改如下:
case kCFStreamEventOpenCompleted:
theFlags |=kDidCompleteOpenForRead;
[selfperformSelectorOnMainThread:@selector(doStreamOpen)withObject:nilwaitUntilDone:YES];
//[self doStreamOpen];
break;
应该是放在主线程里执行就行了。
如果还是不行,那么我做的另一个变动是把delegate设置成了属性
@property(nonatomic,assign)id<AsyncSocketDelegate> theDelegate;
注意要在
@protocol AsyncSocketDelegate 后面加上 <NSObject> 要不然会报找不到委托方法的错误。
如果还是不行,欢迎来跟我一起讨论 ———— LC
最后
以上就是任性铃铛为你收集整理的iOS POS之 AsyncSocket release环境运行崩溃问题的全部内容,希望文章能够帮你解决iOS POS之 AsyncSocket release环境运行崩溃问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复