我使用继承了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()
当网络状态更改时,它偶尔会显示为零。
答案 0 :(得分:3)
startMonitoring
方法采用一个闭包,其中包含对视图控制器实例的weak
引用。这种关闭使ReachabilityManager
的单例实例知道每当网络状态更改时需要发生什么。
对此闭包进行弱引用可确保不再使用视图控制器实例所占用的内存,从而避免潜在的内存泄漏。
有时,关闭视图控制器(或不再在其他地方使用它)时,视图控制器将收集垃圾,但是ReachabilityManager
的单例实例(超出视图控制器的寿命)仍将调用传递给了startMonitoring
方法。由于您的视图控制器已被垃圾回收,因此在这种情况下,self
将是nil
,并且您会偶尔看到nil
的打印。
如果闭包中包含对视图控制器的strong
引用,则可能会面临内存泄漏,因为视图控制器在关闭时不会得到垃圾回收。