我一直在努力研究如何在我的Titanium应用上处理内存分配(专为android [9.4MB],ios [2.8MB]和MobileWeb [5.4MB]而构建。< / p>
我创建了一个小部件,用于从菜单选择中打开视图。
<Alloy>
<Window id="mainWindow">
<View id="menuView">
<View id="vTop">
<!-- Header goes here -->
<TableView id="menuTable" />
</View>
<!-- footer message goes here -->
</View>
<View id="contentView">
<View id="nav">
<Label id="winTitle"/>
<View id='leftButtonView'>
<Label id="icoLeftButton" />
</View>
<View id='backButtonTitleView'>
<Label id="icoBack" />
<Label id="backButtonTitle" />
</View>
<View id='rightButtonView'>
<Label id="icoRightButton" />
</View>
</View>
<View id="mainView" layout="composite" />
</View>
</Window>
</Alloy>
此小部件的示例用法:
我可以通过this solution来减少视图的内存分配。每次我从菜单选择中打开另一个视图时,我都会应用它。
(我的小部件的控制器)
var memPool = Ti.UI.createWindow();
memPool.open();
memPool.hide();
memPool.close();
// Open view from menu selection
function openView(e) {
var cbAdd = function() {
var ctrl = Alloy.createController(e["url"]);
if (ctrl != null) {
setWindowTitle(e["wTitle"]);
setRightIco(ctrl.getRightIco()); //setting right label icon (IcoMoon font)
$.setRightNavClick(ctrl.getRightNavCb());
//Have to passed navGroup to be able to open other views
ctrl.winMain.navGroup = $;
//Close splash screen after layout
ctrl.winMain.addEventListener("postlayout", postLayout);
$.mainView.add(ctrl.winMain);
ctrl.init();
ctrl = null;
}
};
var cbRemove = function() {
//Remove all children from mainView; fn [commonjs]
fn.removeChildren($.mainView, cbAdd);
};
if ($.mainView.children.length > 0) {
cleanUp($.mainView.children[0]);
cbRemove();
} else
cbAdd();
}
function cleanUp(obj, cb) {
memPool.open();
memPool.hide();
memPool.setZIndex(-1);
memPool.add(obj);
memPool.close();
obj = null;
if (cb != null) cb();
}
在XCode Instruments上检查结果:
每次我从菜单打开其他视图时,
TiUIView
总是会减少,但TiUIViewProxy
没有。
要打开的示例视图:(由小部件组成)
<Alloy>
<View id="winMain">
<ScrollView id="form" layout="vertical">
<Widget id="fperiod" src="ph.com.test.controls.period" top="10" />
<Widget id="ftermid" src="ph.com.test.controls.key" label="Terminal No." top="20" />
<Widget id="fofficeid" src="ph.com.test.controls.combobox" label="Branch" />
<View id="btnReset" width="100%" height="50" layout="horizontal" top="20" bottom="20" backgroundColor="#B40026">
<Label class="resetFilter" />
<Label class="lblReset" />
</View>
</ScrollView>
</View>
</Alloy>
以下是有助于实施的参考资料:
TiUIViewProxy
的内存分配?我是否还必须从其控制器清除窗口小部件的视图?我试图从其控制器清理我的小部件的视图。然后,TiUIViewProxy
在XCode Instruments上检查时有所减少,但我的问题是我的应用程序突然崩溃了。我不知道为什么。或者我不只是做得对。我的小部件中的示例清理功能:
$.cview.remove($.formItemLabel);
$.cview.remove($.lblValue);
$.mView.remove($.cview);
//nulling controller variables goes here
mData = null;
animateLeft = null;
...
答案 0 :(得分:0)
这是关于内存管理的非常好的文章,我遵循这些指导原则用于自己的开发目的,强烈建议您仔细阅读。