在MXML中设置变量,同时避免数据绑定?

时间:2011-06-02 16:58:28

标签: flex memory-management mxml flash

我喜欢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仍设置了一些绑定逻辑,但没有那么多,并且一直在想为什么会这样。

谢谢你!

1 个答案:

答案 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进行绑定)并显示这些结果。