将加载的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
答案 0 :(得分:3)
我认为George Profenza是正确的。尽管使用对象似乎是一个好主意 - 除非您从XML中解析出特定信息 - 直接使用XML并放弃使用该对象也会起作用。您可以以与对象相同的方式遍历和应用XML,并且它将消除一小部分开销。
根据您的问题,当您使用XMLData == null
清除对象时,垃圾收集器将不会触摸它,直到所有对数据的引用被剥离。
使用System.disposeXML()
- 你强迫集合发生。
进入调试器,并在调用System.disposeXML()
时停止。观察对象看它是如何清理的。
我相信station.name
不是字符串类型 - 因此将作为XML的对象引用 - Cast在使用时作为字符串。
应该这样做:
stationObject.name = String(station.name)
或
stationObject.name = station.name as String
其中一种可行。
它会将数据转换为字符串,而不是或 @XML类型。
答案 1 :(得分:0)
station.name正在引用回XML对象
您应该将其转换为字符串
stationObject.name = String(station.name)