web-dev-qa-db-ja.com

iOS6 MKMapViewは大量のメモリを使用し、アプリをクラッシュさせるまで、他の誰かがこれに気づきましたか?

IOS 6アプリでマップを使用している他の人は、アプリがクラッシュするまで何度もメモリ警告を受信するまで、非常に高いメモリ使用に気づいていますか?

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

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

52
Jeremy Fox

ここで言及されたいくつかのアイデアをいろいろ試してテストした後、私にとってうまくいった最終的な解決策は次のとおりでした。

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

  • また、メモリ警告が受信されると、iOS 6マップがメモリの解放を非常にうまく処理できることもわかりました。はい、ズームおよびパン中により多くのメモリを消費しますが、メモリ警告に適切に応答しているようです。

  • 私がしなければならなかった最後のことは、全体の初期メモリフットプリントを削減する作業でした。予想以上に高いところからスタートしていることに気づいたので、それはまた、メモリに関連するクラッシュの原因にもなっています。最初のフットプリントを取得したら、MKMapViewにメモリ警告中にメモリの解放を処理させ、アプリ全体で再利用できるMKMapViewのインスタンスが1つだけであることを確認しました。すべてが正常に動作しています。

23
Jeremy Fox

私もこの問題を抱えています。 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のalloc initの周りにautoreleasepoolを作成する

2)北極圏のベクター情報はそれほど密度が高くないかもしれないと思っていたため、表示領域を緯度84経度-30付近に設定します。しかし、助けにはなりません;)

この問題は非常に深刻で、iOS 6でアプリが不安定になり、大量のメモリ警告が発生します。Appleが私のものよりも優れたホットフィックスをリリースすることを期待しています...すぐに!!

ホットフィックスを批判し、マップを破棄するときにメモリ使用量を削減するためのより効果的な方法を考えてください。ありがとう!

21
Wirsing

同じ問題が発生します。

ズームおよび場所の変更後にメモリが解放されることはありません。

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

8
Mat007

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

ストーリーボードにマップビューが設定されているView Controllerとの間でセグエが発生すると、約10〜15回の表示と終了のサイクル後にクラッシュします(私にとって)。

修正は簡単に見えるようになりました。これを追加する

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

問題を修正したようで、20回以上往復でき、問題はありません。クラッシュなし!!

お役に立てれば。これはイライラする問題であり、解決できて嬉しかったです。

7
DogCoffee

私の足跡は:2.48; 19.51; 49.64; 12.60:mapViewをロードする前、mapViewをロードした後、少しズームイン/アウトした後、mapViewをリリースした後のメモリダウン!)

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

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

5
eslyverano

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

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

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

5
mateo
- (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];
}
3
dimo hamdy

私は同じ気持ちを持っていますが、releaseが使用されていなくても、このmemoryMKMapViewする方法がわかりません。

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

IOS5の古いMKMapViewでこれを体験することを忘れないでください。

3
mateo

私は同じ問題を受け取っています-

これについてはよくわかりませんが、新しいAppleマップはオフラインナビゲーションに対応するためにマップの巨大な領域をプリロードしているのでしょうか?

マップが読み込まれた後に接続をオフにし、目的の場所の近くにないエリアを拡大してみてください。すると、非常に多くの詳細がまだ利用できるようです。

2
Matt Green

2014年以降(iOS8以降)に旅行する人向け

私は古いデバイスをサポートしようとしているiOS 7+でこの問題に直面しています(512MBのiPad 2を考えてください)。

私の解決策は、Zoomが最も多くのメモリを消費するため、Zoomを無効にすることです。

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

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

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

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

2
stevebot

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

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

-(void)viewDidDisappear:(BOOL)animated
{
     self.map = nil; 
}
1
kalan