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

Я разрабатываю приложение с титановым сплавом. У меня есть несколько 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>

другой.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;

    });

person Kerberos    schedule 22.06.2017    source источник


Ответы (2)


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

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

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

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

person Adam Paxton    schedule 23.06.2017
comment
Я отредактировал свой вопрос с кодом моего контроллера? Каково ваше предложение? это правильный подход? - person Kerberos; 23.06.2017
comment
У вас есть конкретная проблема с утечкой памяти? Вы можете опубликовать вопрос с проблемой, с которой вы столкнулись. См. также управление памятью. Что касается вашего кода, то $.destroy() нужен только при связывании данных. Да, вам нужно удалить глобальные прослушиватели событий. Я бы попытался избежать их и вместо этого использовал что-то вроде магистральных событий. - person Adam Paxton; 23.06.2017
comment
Я открываю более 10 окон. Родительские окна не закрываются. Вы предлагаете какой-либо алгоритм для приложения с несколькими окнами? - person Kerberos; 24.06.2017

Моей статье на эту тему уже три года. Но, при быстром просмотре, я думаю, что все это применимо и сегодня. 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

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

person skypanther    schedule 23.06.2017
comment
Большое спасибо. Так в чем же разница между win = null и win = undefined? - person Kerberos; 23.06.2017
comment
Я отредактировал свой вопрос с кодом моего контроллера? Каково ваше предложение? это правильный подход? - person Kerberos; 23.06.2017
comment
На самом деле нет никакой разницы между win = null и win = undefined с точки зрения освобождения собственных объектов из памяти в Titanium. Существуют тонкие различия между null и undefined, но для того, что вы здесь делаете, это не имеет значения, это скорее предпочтение или привычка разработчика. Вам, вероятно, не нужен $.removeListener();, и если вы не используете привязку данных Alloy к глобальным коллекциям, вам не нужен $.destroy(); Но остальная часть вашего обновленного кода контроллера, насколько я могу судить, выглядит нормально. - person skypanther; 25.06.2017
comment
Большое спасибо. На самом деле я открываю более 10 окон. Родительские окна не закрываются. Вы предлагаете какой-либо алгоритм для приложения с несколькими окнами? - person Kerberos; 25.06.2017