ActionScript - удаление XML после назначения данных массиву объектов? - PullRequest
2 голосов
/ 13 ноября 2010

после назначения загруженных данных XML массиву объектов я хотел бы удалить XML из памяти или, по крайней мере, доступный для сборщика мусора. однако при этом также удаляются назначенные значения объекта в массиве.

вместо того, чтобы звонить XMLdata = null;, я звоню System.disposeXML(XMLData);, как указано в документации:

Метод disposeXML (): делает указанный объект XML немедленно доступно для сбора мусора. это метод удалит родителя и потомка соединения между всеми узлами для указанный узел XML.

не должен ли я пытаться избавиться от загруженных данных XML после присвоения их массиву объектов?

//Convert XML Data To Array Of Objects
var XMLData:XML = XML(evt.currentTarget.data);

for each    (var station:XML in XMLData.station)
            {
            var stationObject:Object = new Object();
            stationObject.name = station.name;

            arrayData.push(stationObject); 
            }

//Nullify XML
trace(XMLData == null); //false
trace(arrayData[0].name); //traces name
XMLData = null;
trace(XMLData == null); //true
trace(arrayData[0].name); //traces name

//Dispose XML
trace(arrayData[0].name); //traces name
System.disposeXML(XMLData);
trace(arrayData[0].name); //does not trace, traces nothing

Ответы [ 2 ]

3 голосов
/ 13 ноября 2010

Я думаю, что Джордж Профенца прав.Хотя может показаться хорошей идеей использовать объект - если только вы не анализируете конкретную информацию из XML - использование XML напрямую и отказ от использования объекта будут работать так же хорошо.Вы можете просматривать и применять XML так же, как объект, и это снимет небольшую нагрузку.


В соответствии с вашим вопросом, при использовании XMLData == null вы очищаете объект, носборщик мусора не будет прикасаться к нему, пока все ссылки на данные не будут удалены.используя System.disposeXML() - вы заставляете коллекцию происходить.

Войдите в отладчик и остановитесь, как только вызывается System.disposeXML().Посмотрите на предмет, посмотрите, как его убирают.Я полагаю, что station.name не является строковым типом - и, следовательно, на него будет ссылаться как на объект XML - При использовании его будет приводиться как строка.

Это должно быть сделано так:

stationObject.name = String(station.name)

или

stationObject.name = station.name as String

Один из них будет работать.

будет приводить данные в виде строки, а не , возможно, типа @XML.

0 голосов
/ 23 февраля 2014

имя станции. Ссылается обратно на объект XML

Вы должны просто привести его как строку

stationObject.name = String(station.name)
...