2

再現できないクラッシュ レポートを収集したアプリがあります。[super didReceiveMemoryWarning]独自のメモリ警告を処理するときに呼び出すだけのView Controllerがあります(はい、これを行う必要がないことはわかっていますが、現在抱えている問題も解決しません)。親UIViewControllerがpurgeMemoryForReasonを呼び出そうとすると、クラッシュします

関連するトレース情報は次のとおりです。

Exception Type:  SIGSEGV
Exception Codes: SEGV_ACCERR at 0x90000008
Crashed Thread:  0

Thread 0 Crashed:
0   libobjc.A.dylib                     0x361dbf78 objc_msgSend + 16
1   UIKit                               0x31fbf499 -[UIViewController purgeMemoryForReason:] + 65
2   MyApp                               0x00016f0d -[AttributesViewController didReceiveMemoryWarning] (AttributesViewController.m:76)
3   Foundation                          0x30c5b4ff __57-[NSNotificationCenter addObserver:selector:name:object:]_block_invoke_0 + 19
4   CoreFoundation                      0x34d86547 ___CFXNotificationPost_block_invoke_0 + 71
5   CoreFoundation                      0x34d12097 _CFXNotificationPost + 1407
6   Foundation                          0x30bcf3eb -[NSNotificationCenter postNotificationName:object:userInfo:] + 67
7   Foundation                          0x30bd0c1b -[NSNotificationCenter postNotificationName:object:] + 31
8   UIKit                               0x31f8a271 -[UIApplication _performMemoryWarning] + 81
9   UIKit                               0x31f8a36b -[UIApplication _receivedMemoryNotification] + 175
10  libdispatch.dylib                   0x30de42e1 _dispatch_source_invoke + 517
11  libdispatch.dylib                   0x30de1b81 _dispatch_queue_invoke$VARIANT$mp + 53
12  libdispatch.dylib                   0x30de1ec1 _dispatch_main_queue_callback_4CF$VARIANT$mp + 157
13  CoreFoundation                      0x34d8d2ad __CFRunLoopRun + 1269
14  CoreFoundation                      0x34d104a5 CFRunLoopRunSpecific + 301
15  CoreFoundation                      0x34d1036d CFRunLoopRunInMode + 105
16  GraphicsServices                    0x3600c439 GSEventRunModal + 137
17  UIKit                               0x31e06e7d UIApplicationMain + 1081
18  MyApp                               0x0000243b main (main.m:15)

エラーを再現できればいいのですが、テスト デバイスまたはシミュレータでメモリ警告を何度トリガーしても、これが発生しません。調べてみましたが、潜在的な問題を指摘する情報が見つからなかったので、私が探すことができるものについての助けをいただければ幸いです。ありがとう!

編集:私が述べたように、私は何もしていませんdidReceiveMemoryWarning

- (void) didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}

はい、私はこれを行う必要がないことを知っています。このコードを削除する予定ですが (なぜまだ残っているのかわかりません)、問題の原因を確実に解決したいと考えています。viewDidUnload私も実装していませんAttributesViewController。ARC を使用していることにも言及する必要がありましたが、それがここで重要かどうかはわかりません。

私が受け取ったフィードバックから、カメラを使用するとメモリ警告が発生します(UIImagePickerControllerソースタイプUIImagePickerControllerSourceTypeCamera)。AttributesViewControllerは、表示されているビュー コントローラーの 2 レベル上のビュー コントローラーによってモーダルに表示され、UIImagePickerControllerオブジェクトやその他のデータを共有しません。カメラがメモリの警告を頻繁に引き起こすことは知っているのでUIImagePickerController、メモリを大量に消費しているという事実以外に関連しているかどうかはわかりません.

常にアナライザーを実行するように Xcode を設定していますが、問題は発生していません。また、Zombies および Leaks インストゥルメントでコードを実行しましたが、問題を再現したり、他の問題を見つけることはできませんでした。

4

1 に答える 1

1

didReceiveMemoryWarning で何をしていますか? メモリを解放していますか?ビューを閉じますか?何?郵便番号![もう少しコードを投稿したようです。ありがとう。]

そうでない場合、didReceiveMemoryWarning の原因となった問題は解決されないため、今後のメモリ割り当て (つまり、新しいオブジェクトの割り当て) の試行が失敗し始める可能性があります。したがって、これらのオブジェクトに依存するコードはすべて失敗します。あなたのコードは、何か新しいものを割り当てるたびに戻り値を実際にチェックしていますか?

さらに重要なことは、これらのメモリ警告が表示される理由を特定しましたか? 確かに、メモリ不足の状況を適切に処理することは重要ですが、人間に可能であれば、それを防ぐことも同様に (それ以上ではないにしても) 重要です。コードをアナライザー ( command+ shift+ B) で実行しましたか? リークの原因を特定するためにアプリ ( command+ ) をプロファイリングしましたか?I

アップデート:

説明を共有していただきありがとうございます。率直に言って、私はアイデアが不足していますが、さらにいくつかの考えがあります。

  1. 問題を再現できない場合、診断するのは困難です (ましてや修正することはできません)。それは本当に優先事項のようです。iPhone 4 または 4S でテストしている場合、512MB の DRAM を楽しんでいますが、3G には 256MB しかなく、3 には 128MB しかありません。ユーザーのデバイスの能力が低い可能性がありますが、新しいデバイスでテストしていますか? それとも、同等の装備を備えたデバイスからのクラッシュ ログですか? デバイスの構成に応じて異なるタイミングで didReceiveMemoryWarning を取得する可能性があるように思われるため、ユーザーに表示されるクラッシュを明らかにするのが難しくなる可能性があります。

  2. アプリがクラッシュするのはなぜですか? didReceiveMemoryWarning操作を継続するために十分なメモリを解放できないことが原因である可能性があります (つまり、必要なオブジェクトの後続のallocs が失敗している) が、これがクラッシュ ログに示されているかどうかはわかりません。このログを見ると、Key Value ObservingNSNotificationCenterロジックを行っているのだろうか? オブザーバーを削除せずに、観測されたオブジェクトが解放されたことに起因する問題を想像できるからです。参考文献を見て、addObserver:selector:name:object:それが Cocoa がバックグラウンドで行っていることなのか、それともあなたのアプリがそれ自体で行っていることなのかがわからないためです。(そして、それは無関係かもしれません。) すべてのクラッシュ ログが同様のコール スタックを示していますか?

  3. アプリは通常、さまざまなポインターが非 nil であることを確認しますか? purgeMemoryForReason繰り返しますが、クラッシュ ログは少し異なると思いますが、nil 値をチェックして、舞台裏で何かがリリースされていないことを確認することには特に注意を払うことが賢明であるように思われます。

  4. そして、他の唯一の提案は、didReceiveMemoryWarning と viewDidUnload のすべてが、メモリ警告の影響を最小限に抑えて、アプリがこのメモリ不足の状況に耐えられるようにするために、できる限りのことを解放しているかどうかだと思います。標準のdidReceiveMemoryWarningは、アクティブでないビューをアンロードしようとするように見えるので、それらがメモリを適切にクリーンアップしていることを確認する必要があります。Managing Your Memory Efficiently に従ってviewDidUnload、またはでビューのオブジェクトを解放していることを確認する必要がありますdidReceiveMemoryWarning

申し訳ありませんが、これ以上建設的な提案はありません。うまくいけば、他の誰かがより良いアイデアを思いつくことができるでしょう。

于 2012-05-04T03:37:58.020 に答える