From 56551301710e6439e07f35d093e2b7c179013880 Mon Sep 17 00:00:00 2001
From: Muxi Yan <mxyan@google.com>
Date: Fri, 21 Oct 2016 00:15:07 -0700
Subject: [PATCH] Break retain cycle and fix bug

---
 src/objective-c/GRPCClient/GRPCCall.m            |  2 +-
 .../GRPCClient/private/GRPCConnectivityMonitor.m | 16 ++++++++++------
 2 files changed, 11 insertions(+), 7 deletions(-)

diff --git a/src/objective-c/GRPCClient/GRPCCall.m b/src/objective-c/GRPCClient/GRPCCall.m
index bbfb5aa45f..e5a90f2cae 100644
--- a/src/objective-c/GRPCClient/GRPCCall.m
+++ b/src/objective-c/GRPCClient/GRPCCall.m
@@ -382,7 +382,7 @@ static NSMutableDictionary *callFlags;
     [NSException raise:NSInvalidArgumentException format:@"host of %@ is nil", _host];
   }
   __weak typeof(self) weakSelf = self;
-  _connectivityMonitor = [GRPCConnectivityMonitor monitorWithHost:host];
+    _connectivityMonitor = [GRPCConnectivityMonitor monitorWithHost:host];
   void (^handler)() = ^{
     typeof(self) strongSelf = weakSelf;
     if (strongSelf) {
diff --git a/src/objective-c/GRPCClient/private/GRPCConnectivityMonitor.m b/src/objective-c/GRPCClient/private/GRPCConnectivityMonitor.m
index 2c5f21684d..8376744e28 100644
--- a/src/objective-c/GRPCClient/private/GRPCConnectivityMonitor.m
+++ b/src/objective-c/GRPCClient/private/GRPCConnectivityMonitor.m
@@ -153,14 +153,18 @@ static void PassFlagsToContextInfoBlock(SCNetworkReachabilityRef target,
 
 - (void)handleLossWithHandler:(void (^)())handler
       wifiStatusChangeHandler:(nonnull void (^)())wifiStatusChangeHandler {
+  __weak typeof(self) weakSelf = self;
   [self startListeningWithHandler:^(GRPCReachabilityFlags *flags) {
-    if (!flags.reachable) {
-      handler();
-    } else if (!_previousReachabilityFlags ||
-               (flags.isWWAN ^ _previousReachabilityFlags.isWWAN)) {
-      wifiStatusChangeHandler();
+    typeof(self) strongSelf = weakSelf;
+    if (strongSelf) {
+      if (!flags.reachable) {
+        handler();
+      } else if (strongSelf->_previousReachabilityFlags &&
+                 (flags.isWWAN ^ strongSelf->_previousReachabilityFlags.isWWAN)) {
+        wifiStatusChangeHandler();
+      }
+      strongSelf->_previousReachabilityFlags = flags;
     }
-    _previousReachabilityFlags = flags;
   }];
 }
 
-- 
GitLab