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

Apache flex 在MXML中设置变量,同时避免数据绑定?,apache-flex,memory-management,mxml,flash,Apache Flex,Memory Management,Mxml,Flash,我喜欢MXML,但我开始注意到它的一些缺点。我正在努力解决的主要问题是,由于需要绑定,它的内存使用量更大。下面是我在Flex4.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"

我喜欢MXML,但我开始注意到它的一些缺点。我正在努力解决的主要问题是,由于需要绑定,它的内存使用量更大。下面是我在Flex4.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>

mxml标签的变量使用(a)幻数、(b)[Bindable]变量和(c)常量进行设置。有趣的是(至少对我来说)场景(c)比(a)占用更多的内存,但比(b)占用更少的内存-我会假设它等于两个场景中的一个,并希望它与(a)相同,但我猜不是

我的主要问题是:有没有办法在MXML中设置不占用内存的变量?我知道我可以在AS中明确地做到这一点,并将MXML保持为一个裸骨结构,但我想知道是否有其他途径

第二个问题:为什么c中的内存使用不同于a和b?我查看了中间代码,似乎const案例仍然设置了一些绑定逻辑,但没有那么多,我一直在想为什么会这样


谢谢大家!

嗯,这是一个很难回答的问题。无论您做什么,如果您添加代码,您都将使用内存。现在,“消耗内存”与您正在做的事情有关,我希望看到关于每个用例的内存分配的更多信息

至于为什么一个比另一个使用更多的内存是一个相当简单的问题(我认为)。它与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中使用变量前面的“&”作为变量)。但正如您所指出的,这里的警告是原语的复制。在总体方案中,与正在创建的所有其他内容相比,它非常小,而且我相当确定您将使用模型之类的工具来存储您的数据;)

至于内联放置的“神奇数字”,我相信之所以需要空间,是因为它现在存储该值的字符串版本和“真实”版本(因为mxml为您进行转换)。至于常数,我不太清楚为什么会占用更多的内存;我会想象它会与变量完全相同,因为它同时复制了这两个变量,但我可能会,因为它需要“锁定”该变量,这样就没有人可以更改它

我建议你尝试做同样的测试,但是用对象和模型来代替,看看你发现了什么。我可以想象一个泛型对象将比一个类使用更多的内存,但如果能看到您所发现的内容,那就太好了:)


编辑:忘了指出,无论是MXML还是纯AS,它们都应该以完全相同的方式工作(除了“神奇数字”一个)。绑定当然会增加额外的内存,但这是一种折衷;更少的内存或绑定的效用。我还建议您尝试在纯Actionscript中执行同样的操作,并将其与mxml对应项(在AS中使用BindingUtils进行绑定)进行比较,同时显示这些结果

我有点好奇你是怎么得到这一切的记忆足迹的。你能编一张所有内存分配的图表吗?这将是伟大的科学测量:)我使用了内存分析器在Flash Builder 4.0。将尝试重新运行并发布值。谢谢您的回答。我同意装订非常方便,因此需要付出代价。然而,在许多情况下,MXML组件中出现的一些变量(比如上面示例中的x和y)不会改变,因此绑定将失去其用途。这对于编译器来说应该是显而易见的,例如,如果您使用setsomething来设置const。你知道有什么方法可以在MXML中设置一个没有绑定的变量,它没有使用幻数的所有缺点吗?我知道你是从哪里来的,因为你试图使用被“复制”的常量。常量的“绑定”并不是真正的绑定,它只是一个一次性的setter,因为它们不会改变,但是因为在本例中它们是原语,所以它们将被复制到组件中,而不是被引用。您可以使用一个类来保存所有变量(模型),然后将这些变量发送到组件,并消除复制原语,因为它没有引用模型(创建了一个可绑定的类,将四个值分配给类中的公共变量,然后在MXML代码中使用myClass.xPos等)。Flash profiler声称应用程序在本例中的内存消耗与变量案例(775K)相同这似乎是一个巨大的差异,虽然很难从分析器输出本身判断是什么原因造成的。但是,我对Flex在引擎盖下的作用的理解仍然有限,所以可能我误解了分析器(或你的建议)。同样,如果你要绑定到一个基元(即使它在模型中),它也会在绑定它的组件中复制该原语。但是,如果将整个模型绑定到该组件,则只发送引用,因此没有额外的内存使用:)你明白我所说的原语是什么意思吗?我想我明白:-)。我想我不知道如何将整个模型绑定到一个标准组件,也就是说,在上面的示例中,我可以看到如何创建自己的标签类,该标签类有一个[Bindable]公共var并将其绑定到它,但我不确定对于一个现成的组件,您将如何做到这一点。无论如何,谢谢你的帮助!