5

新しい Titanium アプリを開始していますが、ベスト プラクティスを使用して、最初からメモリ リークを回避したいと考えています。私は、CommonJS だけでなく、Titanium プラットフォーム全般も初めて使用します。

残念ながら、チタン サラウンドのすべてのサンプル アプリケーションは、新しい推奨ベスト プラクティスTi.include("/lib/module")代わりにオンになっているようです。require("/lib/module")

私が心配しているのは、CommonJS を使用する際のメモリ消費量です。CommonJS Modules in Titaniumのドキュメントでは、モジュールがキャッシュされると記載されていますが、これは、モジュールにアクセスすると、それらの関数が範囲外になっても突然メモリ内に留まるということではないでしょうか?

次の構造の新しいアプリを開始しました

/ctrl           # Model/UI controllers
/lib            # libraries (common + 3rd party)
/ui             # UI forms
/model          # DAL objects for data store

ここから、私のメイン アプリには、次のように大まかに構成された単一のダッシュボード スタイル ビューがあります。

(function() {
    var getMenuItem = require("/ui/main").getMenuItem;
    var win = Titanium.UI.createWindow({
        title:'Main',
        backgroundColor:'#fff'
    });
    var nav = Ti.UI.iPhone.createNavigationGroup({
        window:win
    });
    var sect;
    var data = [];
    sect = Ti.UI.createTableViewSection();
    data.push(sect);
    sect.add(getMenuItem("Customers",
        require("/ctrl/account").createCustMainWindow));
    sect.add(getMenuItem("Schedules",
        require("/ctrl/schedule").createScheduleMainWindow));
    sect.add(getMenuItem("Settings"));
    var menu = Titanium.UI.createTableView({
        style: Ti.UI.iPhone.TableViewStyle.GROUPED,
        data:data
    });
    win.add(menu);
    menu.addEventListener('click',function(e) {
        if (e.rowData.createWindow) {
            var win = e.rowData.createWindow(nav);
            nav.open(win);
        }
    });
    var navWindow = Titanium.UI.createWindow();
    navWindow.add(nav);
    navWindow.open();
})();

正しいプロジェクト構造に関するガイダンスは大歓迎です。

4

3 に答える 3

2

これは純粋にモジュール パターンを使用する開発中のコミュニティ アプリです。また、開発者ブログを調べて、主にモジュール パターンを使用してサンプルを開発した Forging シリーズを見つけてください。

于 2012-03-01T05:13:26.067 に答える
0

ウィンドウが適切に閉じられると、CommonJSモジュールによって使用されていたメモリが解放されます。モジュールをグローバルオブジェクトに割り当てない限り、その場合はリークにはなりません。

個人的には、再利用可能な工場を作っています。実際、それはアプリがどれほど複雑かによって異なります。NavGroup内のいくつかのウィンドウであれば、私はそれをまっすぐに書きます。

また、Xcodeインスツルメントを使用してアプリのプロファイルを作成し、アプリがリークしていないことを確認することを忘れないでください。リークしている場合は、リークを見つけるのに役立ちます。デモについては、このビデオをご覧ください(約1/3の方法で)。

于 2012-03-01T15:42:54.450 に答える
0

私は require() を使用しており、プロジェクトの開始時に require() を長い間使用しています。これはおそらく最大の Titanium プロジェクトの 1 つです。

そして、これらの require ステートメントに何千行ものコードを記述しても、目に見えるコストはないと自信を持って言えます。ただし、コードにメモリ リークがないことを常に確認する必要があります。

于 2012-02-27T10:41:34.880 に答える