Jelajahi Sumber

Fix memory leak in NetworkReachabilityManager. (#3180)

* Fix memory leak.

* Update deinitialization test for NetworkReachabilityManager.

rename

* Add assertion, clean up formatting.

* Make deinit tests more resilient.

Co-authored-by: Jon Shier <jon@jonshier.com>
dirtmelon 5 tahun lalu
induk
melakukan
e217713e6d

+ 1 - 1
Source/NetworkReachabilityManager.swift

@@ -174,7 +174,7 @@ open class NetworkReachabilityManager {
         }
 
         var context = SCNetworkReachabilityContext(version: 0,
-                                                   info: Unmanaged.passRetained(self).toOpaque(),
+                                                   info: Unmanaged.passUnretained(self).toOpaque(),
                                                    retain: nil,
                                                    release: nil,
                                                    copyDescription: nil)

+ 18 - 2
Tests/NetworkReachabilityManagerTests.swift

@@ -127,24 +127,40 @@ final class NetworkReachabilityManagerTestCase: BaseTestCase {
 
     func testThatHostManagerCanBeDeinitialized() {
         // Given
+        let expect = expectation(description: "reachability queue should clear")
         var manager: NetworkReachabilityManager? = NetworkReachabilityManager(host: "localhost")
+        weak var weakManager = manager
 
         // When
+        manager?.startListening(onUpdatePerforming: { _ in })
+        manager?.stopListening()
+        manager?.reachabilityQueue.async { expect.fulfill() }
         manager = nil
 
+        waitForExpectations(timeout: timeout)
+
         // Then
-        XCTAssertNil(manager)
+        XCTAssertNil(manager, "strong reference should be nil")
+        XCTAssertNil(weakManager, "weak reference should be nil")
     }
 
     func testThatAddressManagerCanBeDeinitialized() {
         // Given
+        let expect = expectation(description: "reachability queue should clear")
         var manager: NetworkReachabilityManager? = NetworkReachabilityManager()
+        weak var weakManager = manager
 
         // When
+        manager?.startListening(onUpdatePerforming: { _ in })
+        manager?.stopListening()
+        manager?.reachabilityQueue.async { expect.fulfill() }
         manager = nil
 
+        waitForExpectations(timeout: timeout)
+
         // Then
-        XCTAssertNil(manager)
+        XCTAssertNil(manager, "strong reference should be nil")
+        XCTAssertNil(weakManager, "weak reference should be nil")
     }
 
     // MARK: - Listener