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