3

我使用继承 BaseViewController 的 viewController。在 BaseViewController 的方法“viewDidLoad”中调用函数“monitorNetworkStatus()”。

private func monitorNetworkStatus() {
        ReachabilityManager.shared.startMonitoring { [weak self] (status, presentingVC) in

            print(self?.description)

        }
    }
ReachabilityManager 是一个单例。startMonitoring 函数是这样的
    func startMonitoring(reachabilityStatus: @escaping (_ status: AFNetworkReachabilityStatus, _ presentingVC: UIViewController?) -> Void) {

        AFNetworkReachabilityManager.shared().setReachabilityStatusChange { [weak self] (status) in
            if status != self?.networkStatus {
                // Only notify when status toggling between reachable and not reachable
                if (self?.networkStatus == .notReachable &&
                    (status == .reachableViaWiFi || status == .reachableViaWWAN)) ||
                    status == .notReachable {
                    reachabilityStatus(status, self?.getPresentingViewController())
                }

                self?.networkStatus = status
            }
        }

        AFNetworkReachabilityManager.shared().startMonitoring()
当网络状态发生变化时,它偶尔会打印 nil。
4

1 回答 1

3

startMonitoring方法接受一个闭包,该闭包包含weak对您的视图控制器实例的引用。这个闭包让ReachabilityManager我们的单例实例知道当网络状态改变时需要发生什么。

向这个闭包传递一个弱引用可确保视图控制器实例占用的内存在不再使用时可以被释放,从而防止潜在的内存泄漏。

有时,您的视图控制器会在它被解除(或不再在其他地方使用)时被垃圾收集,但是ReachabilityManager(它比您的视图控制器寿命更长)的单例实例仍将调用startMonitoring之前传递给该方法的闭包。由于您的视图控制器已被垃圾收集,在这种情况下,您selfnil看到nil偶尔被打印出来。

如果闭包持有strong对您的视图控制器的引用,您可能会面临内存泄漏,因为您的视图控制器在关闭时不会被垃圾收集。

于 2019-01-10T03:16:01.063 回答