Рисование маршрута в GMSMapsView не позволит освободить viewController.Как исправить утечку памяти, суженную до этого фрагмента кода? - PullRequest
0 голосов
/ 17 июня 2019

У меня есть приложение GMSMapsView в моем приложении iOS, и я использую контроллер навигации, чтобы несколько раз показывать информацию о поездке водителям.

Приложение начало зависать случайно, и я отладил с помощью Memory Debugger Graph, что viewController, содержащий GMSMapsView, не освобождается даже после исчезновения с одного из экранов.

Я пытался использовать[слабая собственная личность] в замыканиях, так как они вызывают сильный эталонный цикл, что приводит к утечке памяти.Мне удалось удалить пару ссылок из графика, но есть одна последняя ссылка, которая остается там.Я сузил его до одного конкретного метода, а затем до одной конкретной строки кода, которая, если я прокомментирую, работает как шарм.

Но эта линия используется для отображения маршрута от точки A к точке B в GMSMapsView, очень важной информации, которая мне нужна в приложении.Интересно, не могли бы вы помочь мне выяснить, что именно здесь происходит не так?

mapManager.directionsUsingGoogle(from: source, to: destination, directionCompletionHandler: { (route,directionInformation, boundingRegion, error, polylinePoints) -> () in

            if(error != nil)
            {
                print(error)
            }
            else
            {
                DispatchQueue.main.async {

                    let path = GMSPath(fromEncodedPath: polylinePoints!)
                    let polyline = GMSPolyline(path: path)
                    polyline.strokeWidth = 6.0
                    polyline.strokeColor = .black
                    polyline.map = self.googleMap // googleMap = weak outlet

                    completionHandler()
                }
            }
        })

Здесь

polyline.map = self.googleMap

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

Я пытался использовать

DispatchQueue.main.async { [weak self] in
    guard let strongSelf = self else { return; }

        let path = GMSPath(fromEncodedPath: polylinePoints!)
        let polyline = GMSPolyline(path: path)
        polyline.strokeWidth = 6.0
        polyline.strokeColor = .black
        polyline.map = strongSelf.googleMap

        completionHandler()
}

Я хотел бы удалить любые сильные ссылки из моего GMSMapsView и, следовательно, содержащего его viewController.Поэтому, когда я высовываю его, оно освобождается из памяти, и приложение не исчерпывает память, чтобы быть принудительно закрытым iOS.

...