天天看點

iOS POS之 AsyncSocket release環境運作崩潰問題

最近在做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