Android 用の Titanium ベースのモバイル アプリケーションでメモリ リークを制御する方法について説明している多くの Web ページを読みました。
私の状況では、ユーザーがナビゲートできる複数レベルのリスト (実際にはこれらは tableViews) を使用するアプリを構築しています。1 つのウィンドウを使用しており、ユーザーがリスト項目を選択すると、右から左にアニメーション化される新しいビューが作成されます。すべてのプラットフォームで右から左にスライドする新しいウィンドウを作成することは不可能に思われたため、このオプションを選択しました。
すべてのビューで、どの tableRow がクリックされたかを確認するために eventListener が作成され、対応するサブメニューが作成されて画面にアニメーション化されます。
ビューをクリックするたびにメモリ使用量が着実に増加していることに気付きましたが、メモリリークがどこにあるかを特定できないようです。
現在、メイン ウィンドウをチェックして、ウィンドウがアニメーション表示されていないかどうかを確認しています (320px 幅のデバイスでは .left プロパティは 320 です)。次に、このビューをウィンドウから削除し、次を使用してプロキシを null に設定します。
for ( i = 0; i < win.children.length; i++) {
if ( (win.children[i] != null) && (win.children[i].left == 320) ) {
win.remove(win.children[i]);
win.children[i] = null;
}
}
ただし、メモリ使用量はまだ増加しています。これは、次を含む関数を使用して、すべての新しいビューにテーブルとイベント リスナーが含まれていることが原因である可能性があります。
var sub_table = Ti.UI.createTableView({top:'50dp',separatorColor: rowSeparatorColor});
sub_table.setData(data);
sub_table.addEventListener('click', function(e) {
create(e.rowData.data);
});
new_view.add(my_navbar);
new_view.add(sub_table);
return new_view;
それらを個別に消去する必要がありますか、それともビューが破棄されたときに破棄されますか? それらを手動で消去する必要があるのですが、どうすればよいですか?
より一般的なメモとして、メモリ使用量の原因を特定する方法がわかりません。特定の時点でメモリ内にあるすべてのオブジェクトや変数を取得する方法はありますか? Dalvik ツールキットが提供するメモリ使用量をドリルダウンする方法はありますか? すべてのグローバル変数またはイベント リスナーを取得する方法はありますか?