我喜欢MXML,但我开始注意到它的一些缺点。我正在努力解决的主要问题是由于需要绑定而导致内存使用量增加。在下面的超级简单代码片段中,我在Flex 4.0上测试过
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">
<fx:Script>
<![CDATA[
import mx.events.FlexEvent;
[Bindable] private var xPos:Number = 20;
[Bindable] private var yPos:Number = 20;
[Bindable] private var testo:String = "hello";
[Bindable] private var colorVar:uint = 0x212122;
private const xPosConst:Number = 20;
private const yPosConst:Number = 20;
private const testoConst:String = "hello";
private const colorVarConst:uint = 0x212122;
]]>
</fx:Script>
<!-- <s:Label x="20" y="20" text="hello" color="0x212122"/>-->
<s:Label x="{xPos}" y="{yPos}" text="{testo}" color="{colorVar}"/>
<!-- <s:Label x="{xPosConst}" y="{yPosConst}" text="{testoConst}" color="{colorVarConst}"/>-->
</s:Application>
使用(a)幻数,(b)[可绑定]变量和(c)consts来设置mxml标签的变量。有趣的是(至少对我而言)情景(c)比(a)占用更多的记忆但是小于(b) - 我会假设它等于两者中的一个,并且希望它与(()相同( a)但我猜不是。
我的主要问题:有没有办法在MXML中设置不占用内存的变量?我知道我可以在AS中明确地执行此操作并将MXML保持为裸骨结构,但是想知道是否存在替代路径。
次要问题:为什么c中的内存使用与a和b不同?我已经查看了中间代码,似乎const case仍设置了一些绑定逻辑,但没有那么多,并且一直在想为什么会这样。
谢谢你!答案 0 :(得分:2)
嗯,这是一个有问题的问题。无论你做什么,如果你添加代码,你将使用内存。现在,“吃掉记忆”与你正在做的事情有关,我希望看到有关每个用例的内存分配的更多信息。
至于为什么一个人比另一个人使用更多的内存是相当简单的(我认为)。它与Flash管理对象的方式有关。默认情况下,Flash使用引用基础变量,但原语不计算并重复。例如:
var a:Object = {};
var b:Object = a;
// then a === b as in the same reference in memory (check it in debugger)
// However
var a:String = 'weee';
var b:String = a;
// Then a !== b since the String is duplicated in memory
之所以这样,是因为他们想让Actionscript保持足够简单,并且开发人员不必担心内存引用(比如在C或Java中使用变量前面的'&amp;'表示变量)。但正如你所指出的那样,需要注意的是原语的重复。在宏观方案中,与其他所有东西相比,它是非常小的,而且我相当确定你会使用模型等来存储你应该的数据;)
至于内联的'魔术数字',我相信这个占据空间的原因是因为它现在存储了该值的String版本和'真实'版本(因为mxml为你做了演员)。至于常数,我不确定为什么会使用更多的内存;我想象它与变量完全相同,因为它复制了两者,但我可能是因为它需要“锁定”该变量,所以没人能改变它。
我建议您尝试进行相同的测试,但使用对象和模型来查看您发现的内容。我会想象一个通用的Object会比一个Class使用更多的内存,但看看你发现的东西会很简洁:)
编辑:忘了指出如果它是MXML或纯AS并不重要,它们应该以完全相同的方式工作(除了'魔术数字'之外)。绑定确实增加了额外的内存,但这是一个权衡;更少的记忆或绑定的效用。我还建议你尝试在纯ActionScript中做同样的事情,并将它与它的mxml对应物进行比较(在AS中使用BindingUtils进行绑定)并显示这些结果。