소스 검색

Use weak/strong capture when closing the socket.

Nikita Lutsenko 2 년 전
부모
커밋
a5acaf5e3a
1개의 변경된 파일10개의 추가작업 그리고 5개의 파일을 삭제
  1. 10 5
      SocketRocket/SRWebSocket.m

+ 10 - 5
SocketRocket/SRWebSocket.m

@@ -499,19 +499,24 @@ NSString *const SRHTTPResponseErrorKey = @"HTTPResponseStatusCode";
 - (void)closeWithCode:(NSInteger)code reason:(NSString *)reason
 {
     assert(code);
+    __weak typeof(self) wself = self;
     dispatch_async(_workQueue, ^{
-        if (self.readyState == SR_CLOSING || self.readyState == SR_CLOSED) {
+        __strong SRWebSocket *sself = wself;
+        if (!sself) {
+          return;
+        }
+        if (sself.readyState == SR_CLOSING || sself.readyState == SR_CLOSED) {
             return;
         }
 
-        BOOL wasConnecting = self.readyState == SR_CONNECTING;
+        BOOL wasConnecting = sself.readyState == SR_CONNECTING;
 
-        self.readyState = SR_CLOSING;
+        sself.readyState = SR_CLOSING;
 
         SRDebugLog(@"Closing with code %d reason %@", code, reason);
 
         if (wasConnecting) {
-            [self closeConnection];
+            [sself closeConnection];
             return;
         }
 
@@ -538,7 +543,7 @@ NSString *const SRHTTPResponseErrorKey = @"HTTPResponseStatusCode";
         }
 
 
-        [self _sendFrameWithOpcode:SROpCodeConnectionClose data:payload];
+        [sself _sendFrameWithOpcode:SROpCodeConnectionClose data:payload];
     });
 }