我们有一个iOS应用程序,它有一个UITableView,其中包含当单元格出现时生成的地图快照。我们使用的示例列表只是简单地显示基于Model类中提供的lat/long的映射快照。我开始注意到内存崩溃,所以我将代码减少到最低限度。崩溃仍然会发生,当我们只做快照时,甚至没有对结果做任何操作。有关代码,请参见下面的代码,代码包含在我们的自定义单元格中,并通过cellForItemAtIndexPath方法调用:
private func testMapSnapshot(viewModel: StreamViewModel)
{
let latDelta:CLLocationDegrees = 0.005
let lonDelta:CLLocationDegrees = 0.005
let span:MKCoordinateSpan = MKCoordinateSpanMake(latDelta, lonDelta)
let location:CLLocationCoordinate2D = CLLocationCoordinate2DMake(viewModel.coordinate.latitude, viewModel.coordinate.longitude)
let region:MKCoordinateRegion = MKCoordinateRegionMake(location, span)
let options = MKMapSnapshotOptions()
options.region = region
options.size = mapImageView.frame.size
options.scale = UIScreen.mainScreen().scale
viewModel.mapSnapshotter = MKMapSnapshotter(options: options)
viewModel.mapSnapshotter!.startWithCompletionHandler() { snapshot, error in
// do nothing
}
}在didEndDisplayingCell中,我确保取消mapSnapshotter。参见参考(我们将模型列表保存在包含表视图的主要VC类中):
func collectionView(collectionView: UICollectionView, didEndDisplayingCell cell: UICollectionViewCell, forItemAtIndexPath indexPath: NSIndexPath)
let model = viewModel?[indexPath.item] {
model.mapSnapshotter?.cancel()
model.mapSnapshotter = nil
}
}注意,在执行最后一步之前,它已经崩溃了。但是现在,如果你开始快速地滚动列表,它就会开始口吃,并且不会停止口吃。如果您上上下下地列出了大约150行,则需要不到30秒的时间,我们就可以开始看到内存警告,然后再发生崩溃。
我查了一遍仪器,但没什么用。看起来,Heap和匿名VM分配正在逐渐增加,可能会导致崩溃。参考见:

我看到了这篇文章:MKMapSnapshotter uses incredible amounts of CPU & RAM,但它没有得到解答,也没有真正解决为什么内存不被释放的问题。
对这件事该怎么办有什么想法吗?谢谢您的提前,请让我知道,如果我可以提供更多的信息。
发布于 2016-07-13 20:08:35
虽然我无法找到解决这个特定问题的方法,但我只能在scrollView停止时调用映射快照来解决这个问题--然后它会抓取所有可见的单元格,并只加载这些单元格。这样,它减少了对该API的调用次数,并防止了内存问题,而不是通过cellForRow方法向下滚动列表时不断调用它。
https://stackoverflow.com/questions/38250875
复制相似问题