gpt4 book ai didi

memory-management - Appcelerator Titanium View 代理内存管理

转载 作者:行者123 更新时间:2023-12-03 01:40:55 25 4
gpt4 key购买 nike

我一直在努力解决如何处理 Titanium 应用程序上的内存分配(为 [9.4MB]、 [2.8MB] 和 MobileWeb[5.4MB] 构建。

我创建了一个小部件,用于从菜单选择中打开 View 。

<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>

此小部件的示例用法:

enter image description here

我能够通过遵循 this solution 来减少 View 的内存分配。每次我从菜单选择中打开另一个 View 时,我都会应用此功能。

(我的小部件的 Controller )

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 上检查结果:

enter image description here

每次我从菜单中打开其他 View 时, TiUIView 总是会缩小,但 TiUIViewProxy 不会。

要打开的示例 View :(由小部件组成)

<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的内存分配?我是否还必须从 Controller 中清理小部件的 View ?

我尝试从 Controller 中清理小部件的 View 。然后,根据在 XCode Instruments 上检查,TiUIViewProxy 有所减少,但我的问题是我的应用程序突然崩溃。我不知道为什么。或者我只是做得不对。我的小部件中的示例清理功能:

$.cview.remove($.formItemLabel);
$.cview.remove($.lblValue);
$.mView.remove($.cview);

//nulling controller variables goes here
mData = null;
animateLeft = null;
...

最佳答案

这是一篇关于内存管理的非常棒的文章,我出于自己的开发目的遵循这些指南,强烈建议您阅读本文。

Memory Management

http://www.tidev.io/2014/03/27/memory-management/

关于memory-management - Appcelerator Titanium View 代理内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23359545/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com