0

セルが表示されたときに生成されるマップ スナップショットを含む 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 を使用 しています。

これについてどこに行くべきかについて何か考えはありますか?事前に感謝します。さらに情報を提供できる場合はお知らせください。

4

1 に答える 1