セルが表示されたときに生成されるマップ スナップショットを含む UITableView を持つ iOS アプリがあります。使用しているサンプル リストは、モデル クラスで提供される緯度/経度に基づいてマップのスナップショットを表示するだけです。メモリ クラッシュに気付き始めたので、コードを最小限に減らしました。スナップショットのみを実行し、結果に対して何も実行していない場合でも、クラッシュは発生します。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 秒もかからずに、メモリの警告が表示されてクラッシュが発生します。
これを Instruments で実行しましたが、あまり役に立ちませんでした。ヒープと匿名 VM の割り当てが徐々に増加しているように見え、クラッシュを引き起こしている可能性があります。参考までに:
MKMapSnapshotter は信じられないほどの量の CPU と RAM を使用 しています。
これについてどこに行くべきかについて何か考えはありますか?事前に感謝します。さらに情報を提供できる場合はお知らせください。