12

最近変更を加えた既存のアプリがあり、それらの変更をテストしています。このアプリは、私がテストしたすべてのiPad(iOS4およびiOS5)で完全に正常に動作します。アプリに画像の多いビューをいくつか(50以上)読み込んだ後、メモリ不足の警告が表示され、viewDidUnloadメソッドが呼び出され、すべてのコントロールが適切に無効になり、メモリ内の画像キャッシュが自動的にクリアされ、アプリはそのまま続行されます大丈夫。

ただし、iPhone 4およびiPhone4s(iOS5.0.1およびiOS5.1)では、メモリ不足の警告が表示されずにアプリケーションのメモリが不足するという問題が発生します。いくつかの異なるビューを読み込んだ後、最終的に新しいビューが表示され、ほとんど空白になります。コンソールにメモリ割り当てメッセージが表示され、電話全体が応答しなくなり、アプリが停止することがあります。

これが発生する特定のビューは毎回異なるため、1つのビューとは関係がなく、時間の経過に伴うメモリの蓄積だけが関係します。また、メモリリークも発生していないことを確認しました。

この既存の質問は似ています:

低メモリのためにIOSアプリが強制終了されましたが、メモリ警告が受信されませんでした

その答えは、私がループでスタックしている場合にこれが発生する可能性があることを示唆していますが、私のコードがループでスタックしていないことはかなり確信しています。UINavigationControllerでビュー間をクリックするだけで、各ビューに複数の画像が読み込まれます。また、もう1つの質問は、特にiPadで発生していましたが、この問題はiPadでは発生せず、iPhoneのみで発生しました。

ところで、NotificationCenterを介してメモリ不足通知に登録しようとしましたが、アプリデリゲートにapplicationDidReceiveMemoryWarningメソッドがあり、両方にブレークポイントがあり、どちらも呼び出されません。また、デバッガコンソールにもメモリ不足のメッセージは表示されません。

何が起こっているのかについてのアイデアはありますか?


2012年3月26日に追加:

興味深いことに、新しいiPadでアプリをテストしたところ、メモリ不足の通知が受信されないiPhone4および4sで見られるのと同じ問題が発生します。したがって、この他のスレッドと同じ問題が発生しているのではないかと思います。

新しいiPad:メモリ不足の警告が表示されない?

ただし、そのスレッドの開発者はiPadのみのアプリをテストしているため、どのiPhoneでも同じ問題をテストして見つけていません。

私はいくつかの広範なテストを行い、メモリ不足の警告を適切に受信したデバイスと、これまで受信しなかったデバイスのリストを持っています。これまでのところ、問題はiOS5以降でのみ発生しますが、iOS 5.0および5.1を搭載したiPad1では問題が発生しないため、iOS5のすべてのデバイスで問題が発生するだけではありません。

そのリストは次のとおりです。

適切なメモリ不足の警告

iPad1 4.2.1
iPad1 5.0
iPad1 5.1
iPad2 4.3.3
iPhone3G 4.2.1
iPod 3G 4.3.3
iPhone4 4.3.3

低メモリ警告なし

iPhone4 5.1
iPhone4s 5.0.1
iPad3 5.1
4

4 に答える 4

2

私は先週、同様の問題に頭を悩ませてきました。私は何か違うことをしていますが、画像は多少関連しています。

これらすべての画像がどこにあるのかはわかりません。うまくいけば、それらをファイル システムに書き込み、[UIImage imageWithContentsOfFile] を使用してビューにロードします (または、CGImageRefs を使用している場合は、CGImageSourceCreateWithURL を使用します)。避けたいのは、イメージをメモリに保持することです (iOS ではスワッピングはありません!)。

私の場合、イメージを保持するための mmap メモリがいくつかあり、メモリのマップを解除しました (ファイル システムに同期します)。私がしたことは、基本的に、これらの各ファイルで fcntl(fd, F_FULLSYNC) を呼び出して、続行する前にシステムに各ブロックを強制的にフラッシュさせることでした。

于 2012-03-28T20:49:50.943 に答える
1

iPad 3で、大量の大きな画像を含むアプリに取り組んでいます.

iOS 5.0 を展開ターゲットとして設定applicationDidReceiveMemoryWarningすると、アプリがメモリを消費しすぎると呼び出されず、アプリがクラッシュします。

ただし、iOS 5.1 を Deployment Target として設定applicationDidReceiveMemoryWarningすると呼び出されます。したがって、OS は以前に読み込まれた画像を含むキャッシュをフラッシュし、アプリはクラッシュしません。

主な問題は、イメージが大量に使用され、キャッシュされないようにUIImage imageNamed:イメージをロードするために使用することです (@2x のサイズが非常に大きい場合に問題になります)。UIImage imageWithContentsOfFile

iOS 5.1 で多くの画像を非常に高速に表示するapplicationDidReceiveMemoryWarningと、時間内に呼び出されず、クラッシュすることに注意してください。

于 2012-06-27T12:26:27.700 に答える
0

「タイムプロファイラー」ツール用のInstrumentsで実行してみてください。別のスレッドでCPUにバインドされているかどうかがわかります(ただし、自分で作成しない限り、その場合は驚かれることでしょう)。喫煙銃が明らかにならない場合は、「割り当て」機器を実行することもお勧めします。

于 2012-03-24T00:57:54.797 に答える
0

iOS 5.1 を実行している iPad 3 で正確に動作することがわかりました。applicationDidReceiveMemoryWarning は呼び出されず、UIApplicationDidReceiveMemoryWarningNotification の NSNotifications も呼び出されません。他のデバイスでもまったく同じコードをテストしたので、これらをリストに追加できます。

適切なメモリ不足の警告

iPad 2 5.0.1
iPad 2 4.3.5
iPhone 3GS 5.0.1

メモリ不足の警告なし

iPad3 5.1

パターンは次のようになります: 512 MB または 1 GB のメモリを搭載し、5.0.1 - 5.1 を実行する iOS デバイス。

このアプリでは重い UIImage 処理を行っていません。OS の動作が変わったようです。意図的にアプリをより積極的に強制終了させて​​いるか (たとえば、メモリ使用量が多すぎるように見えるアプリをより賢く強制終了しようとしている)、またはメモリ不足の通知が壊れているだけです。

于 2012-04-16T09:28:38.897 に答える