私たちは、セルが現れたときに生成されるマップスナップショットを含むUITableViewを持つiOSアプリケーションを持っています。使用しているサンプルリストは、単純にModelクラスで提供されている緯度/経度に基づいてマップスナップショットを表示しています。私はメモリクラッシュに気付き始めたので、コードを最小限に減らしました。結果が完了してもスナップショットを実行していないときにもクラッシュが発生します。当社独自のセルに含まれているとcellForItemAtIndexPath
メソッドを介して呼び出されるコード、については、以下を参照してください。MKMapSnapshotterメモリクラッシュ - UITableViewの複数の呼び出し
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秒以内で完了します。
これをInstrumentsで実行しましたが、それほど役に立ちませんでした。ヒープと匿名のVM割り当てが徐々に増加しているように見え、クラッシュが発生する可能性があります。参考のために参照してください: MKMapSnapshotter uses incredible amounts of CPU & RAMをしかし、それは未回答だとメモリが解放されない理由は、実際に対応していません:
私はそこにこの記事を見ました。
これはどこに行こうと思っていますか?事前にありがとう、私は詳細を提供できるかどうか私に知らせてください。
MkSnapshotterは非同期です。ですから、あなたがスナップショットを撮っているものはスナップショットでなければなりません。これはおそらくあなたの修正が働く理由です。メモリの観点からは、オブジェクトを作成するときにOSがメモリを割り当てる必要があります(おそらく古いコードでメモリの問題が発生した理由)。 Fyi、cancel()は実際にスナップショットプロセスを開始した場合にのみ機能します。 – goggelj