在GMSMapsView上绘制路线不会让viewController被释放。如何解决缩小到此代码段的内存泄漏?

时间:2019-06-17 12:47:23

标签: ios swift memory-leaks gmsmapview

我的iOS应用程序中有一个GMSMapsView,并使用导航控制器向驾驶员多次显示一些行程信息。

应用程序开始随机崩溃,我使用内存调试器图进行了调试,即使从其中一个屏幕消失后,包含GMSMapsView的viewController也不会被释放。

我尝试在闭包中使用[weak self],因为它们会导致强引用循环,从而导致内存泄漏。我已经能够从图中删除几个参考,但是这里还有一个最终参考。我将其范围缩小到一种特定的方法,然后是一行特定的代码,如果我发表评论,它们就像是一种魅力。

但是该行用于显示GMSMapsView上从A点到B点的路线,这是我在应用程序中需要的非常关键的信息。我想知道您是否可以帮助我弄清楚这里到底出了什么问题。

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强制关闭。

0 个答案:

没有答案