管理CommonJS模块的问题

时间:2013-04-07 09:32:48

标签: javascript memory titanium commonjs

我正在使用Titanium Appcelerator来使用JavaScript开发应用程序。他们建议使用CommonJS方法。可以找到关于CommonJS的简短示例here

对于我的生活,我仍然无法弄清楚如何构建我的代码。

示例:

/* Homescreen.js */
exports.createHomescreen = function () {

    //load all required modules first
    var videoPlayer = require('ui/videoPlayerModule');

    var self = Ti.UI.createWindow({
        width:'100%',
        height:'100%'
    })

    var newPlayer = videoPlayer.createPlayer({
        width:100
        height:50
    });

    self.add(newPlayer);
    return self;
}

videoPlayerModule

/* videoPlayerModule.js */
exports.createPlayer = function (object) {

    //load all required modules first
    var self = Ti.UI.createWindow({
        width:object.width,
        height:object.height
    });

    var exitVideoButton = Ti.UI.createButton({
        width:100,
        height:50
    });

    exitVideoButton.addEventListener('click',function(e){
        self.close();    //When this window is closed, the memory isn't freed.
        self = null;     //Still the memory isn't cleared
    });

    self.add(exitVideoButton);

    return(self);
}

我遇到内存分配问题,因为每当我加载一个videoPlayer并关闭它时,内存永远不会被清除。如果我再次打开videoPlayer,内存将被分配为AGAIN。因此,每次启动videoPlayer时,我的应用程序的内存使用量都会增加。

我知道我的思维方式不对。我在这里忽略了一些非常简单的事情任何人都可以让我知道我做得不对吗?

1 个答案:

答案 0 :(得分:1)

这种情况正在发生,因为您要将Ti.UI.Window(由videoPlayerModule.js创建)添加到另一个Ti.UI.Window(在Homescreen.js中),您不应该这样做。 Ti.UI.Window是一个基本的容器对象,你永远不会把它添加到任何东西(通常),所以当你关闭窗口时,它仍然作为容器窗口的子项之一被引用,所以它永远不会消失。您的self = null;此时无效。

您需要使用View替换视频播放器中的Window,我会尝试这样的事情:

/* videoPlayerModule.js */
exports.createPlayer = function (object) {

    var self = Ti.UI.createView({
        width:object.width,
        height:object.height
    });

    var exitVideoButton = Ti.UI.createButton({
        width:100,
        height:50
    });

    exitVideoButton.addEventListener('click',function(e){
        self.hide();
    });

    self.add(exitVideoButton);

    return(self);
}

这不是一个完整的解决方案,因为你仍然会在内存中拥有该视图,但它比一个完整的窗口要小得多,更好的方法是创建一次,然后{{ 1}}或show()在主屏幕的上下文中需要它时,另一种方法是传递父项,然后在退出时从其父项中删除视图,但这可以解决您的内存问题。