Понимание структуры сплава
Я разрабатываю приложение с титановым сплавом. У меня есть несколько файлов 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
в контроллере), поэтому при переключении между контроллерами представления мне не нужно искать или запоминать, какое имя или имя файла для этого конкретного окна.