Понимание структуры сплава

Я разрабатываю приложение с титановым сплавом. У меня есть несколько файлов XML. Каждый XML-файл имеет одинаковое представление, а идентификаторы и функции всех представлений одинаковы. этот подход корректен или я должен назначить другой идентификатор и другую именованную функцию для всех объектов для предотвращения утечки памяти. Я имею в виду, что каждый прокси-сервер XML одинаков или разные по памяти?

home.xml

<Alloy>
    <Window id="home">
<View id="Container" onTouchend="fooFunction"> </View>
</Window>
</Alloy>

detail.xml

<Alloy>
    <Window id="detail">
<View id="Container" onTouchend="fooFunction"> </View>
</Window>
</Alloy>

other.xml

<Alloy>
    <Window id="other">
<View id="Container" onTouchend="fooFunction"> </View>
</Window>
</Alloy>

А как очистить объект от памяти, когда я закрываю окно для предотвращения утечки памяти?

Отредактировано для события закрытия окна для предотвращения утечки памяти;

    $.detail.addEventListener("close", function() {

        // this listerner creates when window open for paused app event
        Ti.App.removeEventListener("app:RefreshJson", fncRefreshJson);

        $.Container.removeAllChildren();
        $.detail.removeAllChildren();

        $.removeListener();
        $.destroy();

    // listview creates on the fly when new window opens
    // then I am adding it into $.Container
        listView = null; 
        $.detail = null;

    });

2 ответа

Моей статье на эту тему три года. Но при быстром сканировании я думаю, что это все еще применяется сегодня. http://www.tidev.io/2014/03/27/memory-management/

А как очистить объект от памяти, когда я закрываю окно для предотвращения утечки памяти?

Это зависит:

Если окно является частью группы вкладок, оно будет оставаться в памяти до тех пор, пока приложение работает.

Если это окно, открываемое в группе навигации или в стеке окон на Android, это будет зависеть от того, как вы его создали.

// if you do this:
var win = Alloy.createController('detail').getView();
win.open();

// then to clean up, after
win.close()
// you need to
win = undefined;

// which is why it's better to do this if you can
Alloy.createController('detail').getView().open();

// then, inside of detail, you'd call its Window.close()
// method which would close the window and remove the
// last reference in memory and the object would be GC'd

Кроме того, если вы действительно создаете несколько окон с кодом, похожим на приведенный выше, возможно, вам следует создать виджет. Вы передадите определение характеристик (параметров, имен, дочерних представлений и т. Д.) При создании экземпляра виджета. Этот метод не обязательно поможет с управлением памятью или производительностью. Но это поможет устранить дубликаты кода.

Из документов: идентификаторы должны быть уникальными для каждого представления, но не должны быть глобальными, поэтому несколько представлений могут иметь компоненты с одинаковым идентификатором.

Ваш подход в порядке. Пара заметок

  • Если идентификатор отсутствует в компоненте верхнего уровня в представлении, тогда сплав примет имя файла в качестве идентификатора. Так что если вы остановились id="home"тогда в home.js вы все равно будете ссылаться на объект окна как... $.home так как это имя файла.
  • CamelCasing является распространенным форматом для использования в Alloy, поэтому View id="container" может быть, путь.
  • Утечки памяти, специфичные для Alloy, могут происходить с привязкой данных, поэтому привязки должны быть должным образом уничтожены. Помимо этого, должны применяться те же советы по управлению памятью. Главное - не использовать глобальные слушатели событий. При необходимости вы можете использовать Backbone Events.

Лично мне было проще использовать один и тот же идентификатор для всех моих окон, например: <Window id="win"> (а также $.win в контроллере), поэтому при переключении между контроллерами представления мне не нужно искать или запоминать, какое имя или имя файла для этого конкретного окна.

Другие вопросы по тегам