5

我正在启动一个新的 Titanium 应用程序,并希望使用最佳实践并从一开始就避免内存泄漏。我是 CommonJS 以及 Titanium 平台的新手。

不幸的是,似乎所有关于钛的示例应用程序都围绕Ti.include("/lib/module")而不是更新的推荐最佳实践require("/lib/module")

我担心的是使用 CommonJS 可能需要的内存消耗。从Titanium 文档中的 CommonJS 模块中可以看出,模块将被缓存,这是否意味着如果我曾经访问一个模块,所有这些功能都会突然停留在内存中,即使它们超出了范围?

我已经启动了一个具有以下结构的新应用程序

/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

我使用 require() 并且在项目开始时我有很长的 require() 开始 - 这可能是最大的 Titanium 项目之一。

而且我可以自信地说,在这些 require 语句中放置大量代码行没有明显的成本。但是,您必须经常检查您的代码是否没有内存泄漏。

于 2012-02-27T10:41:34.880 回答
0

AFAIK 每当窗口正确关闭时,CommonJS 模块使用的内存就会被释放。除非您将模块分配给全局对象,否则在这种情况下它不会是泄漏。

就个人而言,我创建了一个可重复使用的工厂。实际上,这取决于应用程序的复杂程度,如果它只是 NavGroup 中的几个窗口,我就直接写了。

并且不要忘记使用 Xcode 工具对您的应用程序进行分析,以确保您的应用程序没有泄漏,如果发生泄漏,它将有助于发现泄漏。观看此视频进行演示(大约 1/3 进入)。

于 2012-03-01T15:42:54.450 回答