1

私はiPhoneアプリを開発しています。C++コードを含む関数の連続呼び出しにNSThreadを使用しています。NSThread または dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^{ 関数呼び出し } を使用すると、5 分後に「受信メモリ警告」警告が表示され、アプリケーションがクラッシュします。しかし、メイン スレッド/キューでこの関数を実行すると、動作します完全に。

また、メモリリークをチェックするためにXcodeプロファイラを試しましたが、メモリリークは見つかりませんでした。

どうすればこの問題を解決できますか?

前もって感謝します。

4

2 に答える 2

1

バックグラウンド スレッドで NSOperationQueue を使用すると、似たような問題が発生しました。関数で必須の NSAutoreleasePool を既に宣言していると仮定すると、オブジェクトを自分で割り当て/解放し、必要でない限り autorelease を使用しないで、メモリが時間通りに解放されるようにすることができます。

2 つ目のアドバイスは、Instruments と Allocations を使用して、メモリを正確に占有しているものを確認することです。おそらく、保持されているオブジェクトがあり、解放されるべきときに解放されていない可能性があります。この投稿は、これに関しては驚くべきものですhttp://www.friday.com/bbum/2010/10/17/when-is-a-leak-not-a-leak-using-heapshot-analysis-to-find -undesirable-memory-growth/また、ここで役立つ情報が見つかるかもしれませんhttp://www.cimgf.com/2008/04/02/cocoa-tutorial-fixing-memory-leaks-with-instruments/

そうでなければ...詳細を投稿する必要があります。

幸運を!

于 2012-05-24T14:49:30.703 に答える
1

特に、保持関数を渡すことによって一部の C コードを呼び出している場合、計測器はすべてのメモリ リークを認識しない場合があります。

スレッドに何が含まれているかを知らずに答えを出すのは難しいですが、解放されていないオブジェクト、誤って割り当て解除されたオブジェクト、または破棄されたオブジェクトについてコードをチェックすることをお勧めします。

また、大量のスレッド ( NSThread) を作成していないこと、およびスレッドが終了後にコンテンツを正しく解放していることも確認する必要があります。

ところで、メモリ警告を受け取ったときにアプリを終了するべきではありません。これは OS からの通常のメッセージです。viewWillUnload/didReceivedMemoryWarning関数が呼び出されたときの割り当て解除を確認してください。

また、シミュレーターを使用してメモリ警告を手動で作成するようにしてください。

于 2012-05-24T12:55:16.467 に答える