【问题标题】:setting variables in MXML while avoiding data binding?在 MXML 中设置变量同时避免数据绑定?
【发布时间】:2011-09-07 05:46:42
【问题描述】:

我喜欢 MXML,但我开始注意到它的一些缺点。我正在努力解决的主要问题是由于需要绑定,它的内存使用量更大。在下面的超级简单代码 sn-p 中,我在 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) 常量来设置 mxml 标签的变量。有趣的是(至少对我而言)场景(c)占用的内存比(a)多但小于(b)-我会假设它等于两者之一,并希望它与( a) 但我想不是。

我的主要问题:有什么方法可以在不占用内存的 MXML 中设置变量?我知道我可以在 AS 中显式地执行此操作,并将 MXML 保留为裸骨结构,但想知道是否有替代路径。

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

谢谢!

【问题讨论】:

  • 我有点好奇你是如何获得这一切的内存占用的。你能制作一张所有内存分配的图表吗?这对于科学测量会很棒:)
  • 我在 Flash Builder 4.0 中使用了内存分析器。将尝试重新运行并发布值。

标签: apache-flex memory-management mxml flash


【解决方案1】:

嗯,这是一个加载的问题。不管你做什么,如果你添加代码,你就会使用内存。现在,“消耗内存”与您正在做的事情有关,我很想看到有关每个用例的内存分配的更多信息。

至于为什么一个人比另一个人使用更多的内存是相当简单的(我认为)。它与 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 对应项(使用 BindingUtils 在 AS 中进行绑定)进行比较,并显示这些结果。

【讨论】:

  • 感谢您的回答。我同意绑定非常方便,因此应该付出代价。但是,在许多情况下,出现在 MXML 组件中的一些变量(例如上面示例中的 x 和 y)不会改变,因此绑定失去了它的用处。例如,如果您将某些内容设置为 const,这对编译器来说应该是显而易见的。你知道有什么方法可以在 MXML 中设置一个变量而不用绑定,并且没有使用幻数的所有缺点吗?
  • 我了解您的来源,因为您尝试使用“重复”的常量。常量的“绑定”并不是真正的绑定,它只是一次性设置器,因为它们不会改变,但是由于它们在本例中是原语,它们将被复制到组件中,而不是被引用。你可以做的是使用一个类来保存你所有的变量(一个模型),然后这些变量可以发送到组件并消除复制原语,因为它没有引用模型。
  • 好的,所以我尝试使用模型(创建一个可绑定类,将四个值分配给类中的公共变量,然后在 MXML 代码中使用 myClass.xPos 等)。 Flash 分析器声称在这种情况下应用程序的内存消耗与变量情况 (775K) 与幻数情况下的 757K 相同。这似乎是一个巨大的差异,尽管很难从分析器输出本身判断是什么原因造成的。但是话又说回来,我对 Flex 在幕后所做的事情的理解仍然有限,所以也许我误解了分析器(或您的建议)。
  • 再一次,如果你要绑定到一个primitive(即使它在一个模型中),它会在你绑定它的组件中复制那个primitive。但是,如果您将 whole 模型绑定到该组件,则只会发送引用,因此不会使用额外的内存:) 你明白我所说的原语的意思吗?
  • 我想我会:-)。我想我不知道如何将整个模型绑定到标准组件,即在上面的示例中,我可以看到如何创建自己的具有 [Bindable] 公共变量的标签类并将其绑定到它,但我我不确定你如何为现成的组件做到这一点。无论如何,感谢您的所有帮助!
猜你喜欢
  • 2021-12-12
  • 2019-08-02
  • 2017-10-11
  • 2017-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多