Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 允许解释XML会导致30 MB内存泄漏_Actionscript 3 - Fatal编程技术网

Actionscript 3 允许解释XML会导致30 MB内存泄漏

Actionscript 3 允许解释XML会导致30 MB内存泄漏,actionscript-3,Actionscript 3,如果您精通AS3中的E4X和XML,请看看这种疯狂 我有一个420 KB的XML。相当大,是的。其结构相当简单: <Nodes> <Node ID="1"> <Element Name="A" /> <Element Name="B" /> </Node> </Nodes> 现在奇怪的部分来了: 运行应用程序。 使用50个字典值中的10个初始化某些对象。 内存消耗:36 MB。 运行应用程序。 使用

如果您精通AS3中的E4X和XML,请看看这种疯狂

我有一个420 KB的XML。相当大,是的。其结构相当简单:

<Nodes>
  <Node ID="1">
    <Element Name="A" />
    <Element Name="B" />
  </Node>
</Nodes>
现在奇怪的部分来了:

运行应用程序。 使用50个字典值中的10个初始化某些对象。 内存消耗:36 MB。 运行应用程序。 使用字典的所有50个值初始化对象。 内存消耗:47MB。 但是。。。如果我这样做:

for each (var obj: XML in objects)
  _SomeDictionary[int(obj.@ID)] = obj.Element;
for each (var obj: XML in objects)
  _SomeDictionary[int(obj.@ID)] = String(obj.Element);
我明白了:

运行应用程序。 使用字典的所有50个值初始化对象,在初始化之前,将字典的值强制转换回XMLList。 内存消耗:16 MB。 因此,通过将XMLList转换为字符串,我节省了30 MB的内存。为什么会发生这种情况?最终,在处理字典值的初始化函数中,将始终创建一个XML列表

第二个问题:当不转换为字符串时,为什么在处理字典的值时内存会增加???它们都已经是XML列表了!为什么当我从字典中提取XML列表并使用一个函数来初始化一些基于它的对象时,内存只从36MB增长到47MB

注意:该函数不会导致内存泄漏:我已经证明,当我使用同一个函数时,我只得到16 MB的内存,但我没有给它一个直接从字典中提取的XML列表,而是给它一个从字典中提取的字符串中提取出来的XML列表。

也许可以解释这一点

在Flash中,即使仅使用片段,也会引用主字符串:

var str:String = "ABCDEFGHIJKLMNOPQRSTUV".substr(0,2);
trace(str + " has master string " + flash.sampler.getMasterString(str));
// output: AB has master string ABCDEFGHIJKLMNOPQRSTUV

内存使用是您的应用程序的一个问题吗?内存使用从来都不是一个问题吗?我认为这样做是不健康的。但要回答你的问题,不,30MB不是问题。47MB,16MB,同样的事情:100MB以下。但是这让我很恼火,我更愿意保持内存使用率尽可能低,因为这些东西是成群结队地出现的,如果你让它们堆积在那里,你会在2个月后醒来,发现一个巨大的程序,你会想这到底是从哪里来的::-D。