我们有一个 iOS 应用程序,它有一个 UITableView,其中包含在单元格出现时生成的地图快照。我们使用的示例列表只是显示基于模型类中提供的纬度/经度的地图快照。我开始注意到内存崩溃,所以我将代码减少到最低限度。当我们只做快照而不对结果做任何事情时,崩溃仍然会发生。请参阅下面的代码,该代码包含在我们的自定义单元格中并通过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。请参阅参考(我们将模型列表保留在包含 tableview 的主 VC 类中):
func collectionView(collectionView: UICollectionView, didEndDisplayingCell cell: UICollectionViewCell, forItemAtIndexPath indexPath: NSIndexPath)
let model = viewModel?[indexPath.item] {
model.mapSnapshotter?.cancel()
model.mapSnapshotter = nil
}
}
请注意,在执行这最后一步之前,它早先崩溃了。但是现在,如果您开始快速向下滚动列表,它就会开始结巴并且不会停止结巴。如果您在大约 150 行的列表中上下移动,则在我们开始看到内存警告和崩溃之前需要不到 30 秒的时间。
我通过 Instruments 运行了这个,但它不是很有帮助。看起来堆和匿名 VM 分配正在逐渐增加,可能导致崩溃。见参考:
我在那里看到了这篇文章: MKMapSnapshotter 使用了令人难以置信的 CPU 和 RAM 但它没有得到答复,也没有真正解决为什么内存不会被释放的问题。
关于在哪里进行此操作的任何想法?提前谢谢你,如果我能提供更多信息,请告诉我。