установка переменных в MXML, избегая привязки данных? - PullRequest
3 голосов
/ 02 июня 2011

Мне нравится 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>

, переменные для меток mxml устанавливаются с использованием (a) магических чисел, (b) переменных [Bindable] и (в) конц.Интересно (по крайней мере для меня) сценарий (с) занимает больше памяти, чем (а), но меньше, чем (б) - я бы предположил, что он будет равен одному из двух, и надеялся, что он будет таким же, как (а) но я думаю нет.

Мой главный вопрос: есть ли способ установить переменные в MXML, которые не поглощают память?Мне известно, что я могу сделать это явно в AS и сохранить MXML как структуру с чистыми костями, но мне было интересно, существует ли альтернативный путь.

Вторичный вопрос: почему использование памяти в c отличается от a и b?Я посмотрел на промежуточный код, и кажется, что случай const все еще устанавливает некоторую логику связывания, но не так сильно, и мне было интересно, почему это так.

спасибо!

1 Ответ

2 голосов
/ 02 июня 2011

Ну, это вроде загруженный вопрос.Независимо от того, что вы делаете, если вы добавите код, вы будете использовать память.Теперь «съесть память» относится к тому, что вы делаете, и я хотел бы видеть больше информации о распределении памяти для каждого варианта использования.

Что касается того, почему один использует больше памяти, чем другой,довольно просто (я думаю).Это связано с тем, как 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 выполняет приведение за вас).Что касается констант, я не совсем уверен, почему это использует больше памяти;Я предположил бы, что это будет точно так же, как переменные, так как они дублируют обе, но я мог бы быть, потому что это должно «заблокировать» эту переменную, чтобы никто не мог ее изменить.

Я бы порекомендовал вам попробовать сделать тот же тест, но с объектами и моделями, чтобы увидеть, что вы обнаружите.Я мог бы предположить, что универсальный объект будет использовать больше памяти, чем класс, но было бы неплохо увидеть, что вы найдете:чисто AS, они должны работать точно так же (за исключением одного «магического числа»).Связывание добавляет дополнительную память, конечно, но это компромисс;меньше памяти или утилита привязки.Я также хотел бы предложить вам сделать то же самое в чистом ActionScript и сравнить его с его аналогом mxml (используя BindingUtils для связывания в AS) и показать эти результаты.

...