当我在块中使用self时会得到零,但是self不会释放

时间:2019-01-10 02:34:10

标签: ios swift inheritance swift-block

我使用继承了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()
当网络状态更改时,它偶尔会显示为零。

1 个答案:

答案 0 :(得分:3)

startMonitoring方法采用一个闭包,其中包含对视图控制器实例的weak引用。这种关闭使ReachabilityManager的单例实例知道每当网络状态更改时需要发生什么。

对此闭包进行弱引用可确保不再使用视图控制器实例所占用的内存,从而避免潜在的内存泄漏。

有时,关闭视图控制器(或不再在其他地方使用它)时,视图控制器将收集垃圾,但是ReachabilityManager的单例实例(超出视图控制器的寿命)仍将调用传递给了startMonitoring方法。由于您的视图控制器已被垃圾回收,因此在这种情况下,self将是nil,并且您会偶尔看到nil的打印。

如果闭包中包含对视图控制器的strong引用,则可能会面临内存泄漏,因为视图控制器在关闭时不会得到垃圾回收。