最近在做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];
}
}
在調delegate方法的時候報記憶體錯誤,直接崩潰。
由于是提示的是記憶體位址原因,我想了想可能是沒在主線程中運作,是以我在調用這個方法的地方在主線程中執行。
在這裡我搜尋了一下調用這個方法(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