3

UIDatePicker コントロールを備えたいくつかのビュー コントローラーを持つアプリを作成しています。

多くのメモリ警告が表示された後、原因について多くのデバッグを行いました。計測器を使用して、UIDatePicker を含むビュー コントローラーが表示されるたびに、メモリ使用量が 2 ~ 3 MB 増加することを確認できました。最終的に、これはメモリ警告につながります。ここでできることはたくさんあり、これらの関数を書き直してからクラッシュが劇的に減少しましたが、私はまだこの動作に慣れておらず、修正したいと考えています。

UIDatePicker は XIB ファイルの一部です。それらをXIBから取り出し、プログラムで追加しようとしました。これでは問題は解決しません。また、(スレッドセーフな)シングルトンを使用してみました。これにより、メモリ使用量が 1 つのインスタンスのみに制限されます(メモリ使用量が増加しないため)が、可能な限りシングルトンを回避しようとしています。シングルトンを使用しますか?

iOS 5 および 4.3 で、それを実行するすべてのデバイスでこの動作が見られます。タイトルが示すように、私はARCを使用しています。

Instruments では、メモリ リークは表示されません。

以下は、Instruments のスクリーンショットです。使用率が上がるたびに、日付ピッカーを含む VC が表示されます。グラフの開始時のベースラインは、2.3MB のメモリ使用量です。

http://i.stack.imgur.com/1S7ns.png

乾杯!

4

2 に答える 2

4

私は自分の質問を解決したようです。これはinputViewであり、inputAccessoryViewとして「Done」ボタンを備えたUIToolbarもありました。

そこで、viewWillAppearでこれらをプログラムで作成します。viewWillDisappearで、UITextFieldのinputViewとinputAccessoryViewをnilに設定し、日付ピッカーと日付ピッカーツールバーをnilに設定しました。

それらはXIBファイルに含まれなくなりました。これは非常にうまく機能しているようです。メモリは3MB増加し、ビューが消えるとすぐに元に戻ります。現在、アプリは10MB未満のライブメモリで一貫して実行されています。場合によっては15MBまで急上昇しますが、ごくまれです。

sudo rm -rfとRobの助けに感謝します。ヒープショット分析は、その根底に到達するのに役立ちました。

于 2012-01-28T03:30:11.303 に答える
4

ここで使用するツールはheapshotと呼ばれます。誤って保持されているオブジェクトの種類を絞り込むのに役立ちます。@sudo が指摘しているように、問題はおそらく日付ピッカー自体ではなく、デリゲートにあります。おそらく、厳密な意味での「漏れ」ではないでしょう。おそらく、意図していないメモリを保持しているだけです (これは、リークのように見えます)。

循環的な強い参照があるかどうかを注意深く確認する必要があります。たとえば、デリゲートへの強い参照を持つオブジェクトはありますか? これは通常、保持ループにつながります (ARC では決して解放されません)。Heapshot は、これらのオブジェクトを見つけるのに役立ちます。

于 2012-01-27T04:43:52.703 に答える