Проблемы с управлением модулями CommonJS

Я использую Titanium Appcelerator для разработки приложений с использованием JavaScript. Они предложили использовать подход CommonJS. Краткий пример CommonJS можно найти здесь.

На всю жизнь я до сих пор не могу понять, как структурировать свой код.

Пример:

/* 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.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);
}

У меня проблемы с выделением памяти, потому что всякий раз, когда я загружаю видеопроигрыватель и закрываю его, память никогда не очищается. Если я снова открою видеоплеер, память будет выделена СНОВА. Из-за этого использование памяти моим приложением увеличивается каждый раз, когда запускается видеоплеер.

Я знаю, что мой образ мыслей неверен. Я пропускаю что-то очень простое здесь. Может ли кто-нибудь дать мне знать, что я делаю не так?


person wiseindy    schedule 07.04.2013    source источник
comment
Какой пакет Titanium SDK вы используете и для какой платформы?   -  person mr.VVoo    schedule 07.04.2013
comment
Я использую последнюю версию Titanium SDK (3.0) и собираю для iOS   -  person wiseindy    schedule 07.04.2013
comment
Ну, была проблема, связанная с этим. Обычно это должно быть исправлено в версии 3.0.2.GA. Думаю, вы уже ознакомились с управлением памятью для Titanium.   -  person mr.VVoo    schedule 07.04.2013
comment
Как используется createHomescreen? Я думаю, что, вероятно, утечка памяти происходит на шаг выше того, что вы нам показали. Придумайте как можно проще полный пример, демонстрирующий вашу утечку, и я смогу помочь.   -  person Dawson Toth    schedule 08.04.2013
comment
Привет @DawsonToth Спасибо за ваш вклад, чувак. Я понял проблему. Я также отметил ответ. :)   -  person wiseindy    schedule 08.04.2013


Ответы (1)


Это происходит потому, что вы добавляете Ti.UI.Window (созданный из videoPlayerModule.js) к другому Ti.UI.Window (в Homescreen.js), чего делать не следует. Ti.UI.Window — это базовый объект контейнера, вы никогда не добавляете его ни к чему (как правило), поэтому, когда вы закрываете окно, на него по-прежнему ссылаются как на одного из дочерних элементов окна контейнера, поэтому он никогда не исчезает. В этот момент ваш self = null; ничего не делает.

Вам нужно заменить окно в видеоплеере на представление, вместо этого я бы попробовал что-то вроде этого:

/* 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);
}

Это не полное решение, так как у вас все еще будет представление в памяти, но это гораздо меньший объем, чем полноценное окно, лучший способ сделать это - создать это один раз, а затем show() или hide() когда необходимо в контексте домашнего экрана, другим способом было бы передать родителя, а затем удалить представление из его родителя при выходе, но это решает вашу проблему с памятью.

person Josiah Hester    schedule 08.04.2013
comment
Да! Понял, @Josiah, попробую оба упомянутых вами варианта. Большое спасибо, чувак :) Ура. - person wiseindy; 08.04.2013