У меня есть приложение 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.