52

iOS 6アプリでマップを使用している他の誰かが、アプリをクラッシュさせるまで何度もメモリ警告を受け取るまでの非常に高いメモリ使用量に気づいていますか?

機器を介してアプリを実行しましたが、リークは発生していません。マップビューが作成されるまで、アプリは約3MBのライブバイトで一貫して実行されます。マップが作成され、タイルがダウンロードされると、LiveBytesは最大13mbLiveBytesにジャンプします。次に、マップを移動し、Live Bytesをズームインおよびズームアウトして、アプリが約40mbLiveBytesでクラッシュするまで上昇し続けます。ちなみにこれはiPhone4にあります。iPod touchでは、さらに早くクラッシュします。

注釈ビューを適切に再利用していますが、何もリークしていません。新しいiOS6マップでこれと同じ高いメモリ使用量を見ている人はいますか?また、誰かが解決策を持っていますか?

4

12 に答える 12

23

いろいろと遊んでさまざまなアイデアをテストした後、その一部をここで説明しましたが、私にとってうまくいった最終的な解決策は次のとおりでした。

  • アプリで必要に応じて新しいMKMapViewを作成する代わりに、AppDelegateにmkMapViewプロパティを追加し、必要な場合にのみ作成しました。作成されると、AppDelegateに永久に存在し、必要な場所でその単一のインスタンスを再利用します。これは、以前にいくつかの異なるMKMapViewをインスタンス化していて、両方が非常に高速にメモリを焼き尽くしていたため、使用されているメモリの量を減らすのに本当に役立ちました。

  • また、メモリ警告を受信すると、iOS6Mapsがメモリの解放を非常にうまく処理することもわかりました。はい、ズームやパン中にメモリを消費しますが、メモリの警告に適切に対応しているようです。

  • 私がしなければならなかった最後のことは、私の全体的な初期メモリフットプリントを減らすことに取り組むことでした。思ったよりずっと高いところから始めていたので、それがメモリに関連して受けていたクラッシュの原因にもなっていることに気づきました。最初のフットプリントを減らしたら、メモリ警告中にMKMapViewにメモリの解放を処理させ、アプリ全体で再利用できるMKMapViewのインスタンスが1つしかないことを確認し、すべてが正常に実行されていることを確認します。

于 2013-01-07T14:42:20.887 に答える
21

私もこの問題を抱えており、それが私を狂わせています。mateoの投稿に基づいて修正プログラムを見つけようとして、これが私が思いついたものです。

- (void)applyMapViewMemoryHotFix{

    switch (self.mkMapView.mapType) {
        case MKMapTypeHybrid:
        {
            self.mkMapView.mapType = MKMapTypeStandard;
        }

            break;
        case MKMapTypeStandard:
        {
            self.mkMapView.mapType = MKMapTypeHybrid;
        }

            break;
        default:
            break;
    }

    [self.mkMapView removeFromSuperview];
    self.mkMapView = nil;
}

理由はわかりませんが、スーパービューから削除してからnilに設定すると、メモリ使用量が大幅に削減されます。コントローラのviewDidDisappearでこのメソッドを呼び出します。

私が試したが、大きな効果がなかった他のこと:

1)mkMapViewのallocinitの周りにautoreleasepoolを作成します

2)北極圏のベクトル情報はそれほど密ではないかもしれないと思ったので、緯度84 lon -30付近に表示領域を設定します...しかし、役に立ちません;)

この問題は非常に深刻で、iOS 6でアプリが不安定になり、大量のメモリ警告が発生します。Appleが私のものよりも優れた修正プログラムをリリースすることを願っています...すぐに!!

私の修正プログラムを批評し、マップを破棄するときにメモリ使用量を削減するためのより効果的な方法を考え出してください。ありがとう!

于 2012-10-20T07:37:45.813 に答える
7

同じ問題が発生します。

ズームして位置を変更した後、メモリが解放されることはありません。

私が見つけた唯一のトリックは、メモリ警告の後にマップタイプを変更することです。

于 2012-10-10T07:21:30.180 に答える
7

この問題は、これを行わない限り、iOS9でも引き続き発生します。

ストーリーボードに設定されたマップビューを使用してビューコントローラーとの間でセグエを行うと、約10〜15回の表示と終了のサイクルの後にクラッシュが発生します(私にとっては)。

これで、修正は簡単なようです。これを追加する

override func viewDidDisappear(animated: Bool) {
    super.viewDidDisappear(animated)
    mapView.removeFromSuperview()
}

問題が修正されたようで、20回以上往復する可能性があり、問題はありません。クラッシュなし!!

お役に立てれば。これは苛立たしい問題であり、解決できてうれしいです。

于 2015-09-06T10:17:24.640 に答える
5

私のフットプリントは2.48でした。19.51; 49.64; 12.60これは、mapViewをロードする前、mapViewをロードした後、少しズームイン/ズームアウトした後、およびmapViewを解放した後のメモリです(これは、mapViewを解放した後でも、10 MBの増分を維持し、実行されません。下!)

とにかく、私はもうMapViewにIBOutletを使用していません。代わりに、すべてをコードで作成しています。新しいフットプリントは2.48になりました。19.48; 38.42; 12.54。

まだbi***を置くことに取り組んでいます。

于 2012-10-02T01:58:33.407 に答える
5

解決策ではなく、単なるトリック...

... mapType=>mapkitリリースメモリを変更します。

この変更がほんの一瞬であっても。

于 2012-10-11T00:41:15.640 に答える
3

release使わなくてmemoryも同じ気持ちでどうしたらいいのかわからないMKMapView

コントローラをリリースしました、、MKMapViewコンテナビュー...memoryはまだ使用されています。

MKMapViewiOS5の古いものでこれを経験することを忘れないでください。

于 2012-10-03T12:59:21.303 に答える
3
- (void)applyMapViewMemoryHotFix{

    switch (self.mapView.mapType) {
        case MKMapTypeHybrid:
        {
            self.mapView.mapType = MKMapTypeStandard;
        }

            break;
        case MKMapTypeStandard:
        {
            self.mapView.mapType = MKMapTypeHybrid;
        }

            break;
        default:
            break;
    }


    self.mapView.mapType = MKMapTypeStandard;



}
-(void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
{
    [self applyMapViewMemoryHotFix];
}
于 2014-10-15T22:42:34.087 に答える
2

同じ問題が発生しています-

これについては完全にはわかりませんが、新しいアップルマップがオフラインナビゲーションに対応するためにマップの広大な領域をプリロードしている可能性がありますか?

地図が読み込まれた後で接続をオフにしてから、目的の場所の近くにない領域を拡大してみてください。まだ非常に多くの詳細が利用できるようです。

于 2012-11-19T16:11:36.517 に答える
2

2014年以降にここを旅する人のために(iOS8以降)

古いデバイスをサポートしようとしているiOS7以降でこの問題が発生しています(512MBのIpad 2を考えてみてください)。

私の解決策は、ズームを無効にすることです。ズームは簡単に最も多くのメモリを消費するからです。

   long mem = [NSProcessInfo processInfo].physicalMemory;
    if(mem < _memory_threshold){
        self.MapView.zoomEnabled = NO;
    }

マップタイプの切り替えから、マップの割り当て解除、デリゲートのnilへの設定、すべてのオーバーレイ、注釈の削除など、すべてを試しました。

iOS7以降では機能しません。実際、これらの修正のほとんどは、MKMapViewがリークし、適切にデアロックしないように見えるため、メモリ内でジャンプを引き起こします(サブクラス化を通じて、デアロックがヒットすることを確認しました)。

これはひどいことですが、これまで私が思いついたのは、MKMapViewが使用するメモリの膨大な量を制限する手段として、マップ機能(ズーム、スクロール、ユーザー操作)を無効にすることだけです。これにより、私のアプリは少なくとも古いデバイスでは半安定になりました。

于 2014-11-11T21:17:20.830 に答える
1

結果についてはよくわかりません。

ただし、ビューが消えるたびにマップを「nil」に設定すると、メモリ使用量を約250MBから約50〜60MBに減らすことができました。

-(void)viewDidDisappear:(BOOL)animated
{
     self.map = nil; 
}
于 2014-11-05T06:38:06.837 に答える
-1

メモリの問題を解決するには、次の行だけで十分です。

Objective-Cの場合:

- (void) applyMapViewMemoryFix {
  [self.mkMapView removeFromSuperview];
  self.mkMapView = nil;}

Swift 3.0の場合:

func applyMapViewMemoryFix() {
    mapView.removeFromSuperview()
    self.mapView = nil
}
于 2018-03-26T12:24:13.893 に答える