Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.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
Flash AS3-内存管理_Flash_Actionscript 3 - Fatal编程技术网

Flash AS3-内存管理

Flash AS3-内存管理,flash,actionscript-3,Flash,Actionscript 3,我有一个关于AS3内存管理的问题,不知是否有人能帮我 假设我为一个类创建了一个实例变量,在本例中为Sound或type: public class SoundStore extends Sprite{ var s:Sound; 然后在各种类函数中,我多次引用该变量,每次我都想加载一个新声音: s = new Sound(); 我是否正确地认为,每次我创造一个新的声音,我会覆盖以前分配的内存 谢谢。AS3是一种垃圾收集语言,它使用引用计数来处理未使用的对象 s变量在内部是指向包含声音对象的内

我有一个关于AS3内存管理的问题,不知是否有人能帮我

假设我为一个类创建了一个实例变量,在本例中为Sound或type:

public class SoundStore extends Sprite{

var s:Sound;
然后在各种类函数中,我多次引用该变量,每次我都想加载一个新声音:

s = new Sound();
我是否正确地认为,每次我创造一个新的声音,我会覆盖以前分配的内存


谢谢。AS3是一种垃圾收集语言,它使用引用计数来处理未使用的对象

s
变量在内部是指向包含
声音
对象的内存块的指针。每次执行
s=new Sound()
AS3将在内存中创建一个新的
Sound
对象,并将
s
指针设置为该对象的地址。旧对象仍然存在于内存中。如果您没有对旧对象的引用,垃圾回收器将在某个点(通常是下一轮收集)处理该对象。这意味着在任何时候,内存中都可能有多个
声音
对象,这些对象没有被引用,但仍在使用资源。垃圾收集器被设计成周期性地遍历所有分配的对象,并在没有对它们的引用时处理它们


这里有一篇关于Flash/AS3中GC的好文章:

否。AS3是一种垃圾收集语言,它使用引用计数来处理未使用的对象

s
变量在内部是指向包含
声音
对象的内存块的指针。每次执行
s=new Sound()
AS3将在内存中创建一个新的
Sound
对象,并将
s
指针设置为该对象的地址。旧对象仍然存在于内存中。如果您没有对旧对象的引用,垃圾回收器将在某个点(通常是下一轮收集)处理该对象。这意味着在任何时候,内存中都可能有多个
声音
对象,这些对象没有被引用,但仍在使用资源。垃圾收集器被设计成周期性地遍历所有分配的对象,并在没有对它们的引用时处理它们


在Flash/AS3中有一篇关于GC的好文章:

好的,谢谢。我知道我不能控制GC何时运行。如果我这样做,这将有助于我的内存管理:try{s=null;}catch(e:Error){}s=new Sound();No.s将停止指向该声音实例,但它仍将位于内存中,直到整个应用程序中没有任何其他内容指向它为止。(这包括事件,除非
usewakrefereces
设置为true)。您可以调用
System.gc()
在Flash 10及更高版本中强制执行垃圾收集,但这是一个非常糟糕的主意。它完全破坏了性能,甚至不能保证在调试之外做任何事情。那么,如果我希望加载多个MP3文件,一次加载一个,再一次只播放一个,那么设置代码的内存效率最高的方法是什么呢。在我创建一个新声音并将其分配给s之前,确保当前的s没有指向它的引用吗?只需将它的所有引用设置为null并正常进行。垃圾收集器将频繁地进行循环,以使其不会成为问题。你唯一需要担心的是确保所有引用都被清除。好的,谢谢。我知道我不能控制GC何时运行。如果我这样做,这将有助于我的内存管理:try{s=null;}catch(e:Error){}s=new Sound();No.s将停止指向该声音实例,但它仍将位于内存中,直到整个应用程序中没有任何其他内容指向它为止。(这包括事件,除非
usewakrefereces
设置为true)。您可以调用
System.gc()
在Flash 10及更高版本中强制执行垃圾收集,但这是一个非常糟糕的主意。它完全破坏了性能,甚至不能保证在调试之外做任何事情。那么,如果我希望加载多个MP3文件,一次加载一个,再一次只播放一个,那么设置代码的内存效率最高的方法是什么呢。在我创建一个新声音并将其分配给s之前,确保当前的s没有指向它的引用吗?只需将它的所有引用设置为null并正常进行。垃圾收集器将频繁地进行循环,以使其不会成为问题。你唯一需要担心的是确保所有对它的引用都被清除。