gpt4 book ai didi

ios - 当我在 block 中使用 self 时,我得到一个 nil。但是 self 没有释放

转载 作者:搜寻专家 更新时间:2023-10-31 22:24:23 25 4
gpt4 key购买 nike

我使用继承 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 。

最佳答案

startMonitoring 方法接受一个闭包,该闭包包含对 View Controller 实例的 weak 引用。此闭包让 ReachabilityManager 的单例实例知道每当网络状态发生变化时需要发生什么。

传递一个弱引用到这个闭包确保你的 View Controller 实例占用的内存在不再被使用时可以被释放,从而防止潜在的内存泄漏。

有时,当您的 View Controller 被关闭(或不再在其他地方使用)时,它会被垃圾收集,但是 ReachabilityManager 的单例实例(比您的 View Controller 长)仍然会调用先前传递给 startMonitoring 方法的闭包。由于您的 View Controller 已被垃圾回收,因此在这种情况下 self 将为 nil 并且您会偶尔看到 nil 被打印出来。

如果闭包持有对您的 View Controller 的 strong 引用,您可能会面临内存泄漏,因为您的 View Controller 在关闭时不会被垃圾回收。

关于ios - 当我在 block 中使用 self 时,我得到一个 nil。但是 self 没有释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54121214/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com