簡體   English   中英

MKMapSnapshotter內存崩潰-UITableView中的多個調用

[英]MKMapSnapshotter memory crash - multiple calls in a UITableView

我們有一個iOS應用程序,該應用程序的UITableView包含當單元格出現時生成的地圖快照。 我們正在使用的示例列表只是根據Model類中提供的經/緯度顯示地圖快照。 我開始注意到內存崩潰,因此我將代碼減少到最低限度。 當我們只做快照而對結果不做任何事情時,崩潰仍然會發生。 參見下面的代碼,這些代碼包含在我們的自定義單元格中,並通過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數量,但是它沒有得到答案,也沒有真正解決為什么不釋放內存的問題。

關於如何進行此操作有任何想法嗎? 預先謝謝您,如果可以提供更多信息,請告訴我。

盡管我無法找到針對此特定問題的修復程序,但我只能通過在scrollView停止時調用地圖快照程序來解決此問題-它會捕獲所有可見的單元格並僅為這些單元格加載。 這樣,它最大程度地減少了對此API的調用,並防止了內存問題,這與在通過cellForRow方法向下滾動列表時不斷調用它相反。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM