Я получаю ноль, когда использую себя в блоке. Но я не свободен - PullRequest
0 голосов
/ 10 января 2019

Я использую viewController, который наследует BaseViewController. Функция «monitorNetworkStatus ()» вызывается в методе BaseViewController «viewDidLoad».

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 голосов
/ 10 января 2019

Метод startMonitoring принимает замыкание, которое содержит ссылку weak на экземпляр вашего контроллера представления. Это закрытие позволяет одноэлементному экземпляру ReachabilityManager знать, что должно происходить при изменении состояния сети.

Передача слабой ссылки на это закрытие гарантирует, что память, занятая вашим экземпляром контроллера представления, может быть освобождена, когда он больше не используется, что предотвращает потенциальную утечку памяти.

Иногда ваш контроллер представления будет собирать мусор, когда он удаляется (или больше не используется в другом месте), но единственный экземпляр ReachabilityManager (который переживает ваш контроллер представления) будет по-прежнему вызывать закрытие, которое было передано startMonitoring метод ранее. Так как ваш контроллер вида был собран мусором, self будет nil в этом случае, и вы увидите, что nil печатается время от времени.

Если бы закрытие содержало ссылку strong на ваш контроллер представления, вы, вероятно, столкнулись бы с утечками памяти, так как ваш контроллер представления не будет собирать мусор при отклонении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...